PHP 通过Spreadsheet导出Excel文件

导出方法
     $export = new Export();

        $list = [];

        $expCellName = [
            'order_id' => 'Id',
            'order_sn' => '母订单号',
            'jd_order_id' => '子订单号',
            'status_text' => '订单状态',
            'pay_type_text' => '支付类型',
            'paytime_text' => '支付时间',
            'user_info' => '用户信息',
            'consignee_info' => '收货信息',
            'score_fee' => '积分支付数量',
            'activity_type_text' => '营销类型',
            'goods_title' => '商品名称',
            'goods_original_price' => '商品原价',
            'goods_price' => '商品价格',
            'goods_sku_text' => '商品规格',
            'goods_num' => '购买数量',
            'dispatch_status_text' => '发货状态',
            'dispatch_fee' => '发货费用',
            'dispatch_type_text' => '发货方式',
            'aftersale_refund' => '售后/退款',
            'comment_status_text' => '评价状态',
            'refund_fee' => '退款金额',
            'refund_msg' => '退款原因',
            'express_name' => '快递公司',
            'express_no' => '快递单号',
        ];
        $newList = [];
        foreach ($list as $key => $order) {
            $data = [
                'order_id' => $order['id'],
                'order_sn' => $order['order_sn'],
                'type_text' => $order['type_text'],
                'status_text' => $order['status_text'],
                'pay_type_text' => $order['pay_type_text'],
                'paytime_text' => $order['paytime_text'],
                'platform_text' => $order['platform_text'],
                'user_info' => $order['user'] ? ($order['user']['nickname'] . '-' . $order['user']['mobile']) : '',
                'consignee_info' =>  ($order['consignee'] . '-' . $order['phone']. '-' . $order['province_name'].$order['city_name'].$order['area_name'].$order['address']),
                'total_amount' => $order['total_amount'],
                'coupon_fee' => $order['coupon_fee'],
                'gift_card_fee' => $order['gift_card_fee'],
                'pay_fee' => $order['pay_fee'],
                'score_fee' => $order['score_fee'],
            ];
            foreach ($order['item'] as $k => $item) {
                $itemData = [
                    'jd_order_id' => $item['jd_order_id'].' ',
                    'activity_type_text' => $item['activity_type_text'],
                    'goods_title' => $item['goods_title'],
                    'goods_original_price' => $item['goods_original_price'],
                    'goods_price' => $item['goods_price'],
                    'goods_sku_text' => $item['goods_sku_text'],
                    'goods_num' => $item['goods_num'],
                    'dispatch_status_text' => $item['dispatch_status_text'],
                    'dispatch_fee' => $item['dispatch_fee'],
                    'dispatch_type_text' => $item['dispatch_type_text'],
                    'aftersale_refund' => $item['aftersale_status_text'] . '/' . $item['refund_status_text'],
                    'comment_status_text' => $item['comment_status_text'],
                    'refund_fee' => $item['refund_fee'],
                    'refund_msg' => $item['refund_msg'],
                    'express_name' => $item['express_name'],
                    'express_no' => $item['express_no'],
                ];

                $newList[] = array_merge($data, $itemData);
            }
        }

        $export->exportExcel('订单列表-' . date('Y-m-d H:i:s'), $expCellName, $newList);

 




Export.php 导出类
<?php

namespace addons\shopro\library;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

/**
 * 导出类
 */
class Export
{


    public function __construct()
    {
        
    }

    /**
     * @param string $expTitle 文件标题
     * @param array $expCellName 导出字段
     * @param array $expTableData 数据
     * @param array $mergeCellsName 合并单元格
     */
    public function exportExcel($expTitle, $expCellName, $expTableData,$mergeCellsName=[]){
        $fileName = $expTitle;
        $cellNum = count($expCellName);

        $spreadsheet = new Spreadsheet();
        $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
        $sheet = $spreadsheet->getActiveSheet(0);

        $styleArray = [
            'alignment' => [
                //'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中
                'vertical' => Alignment::VERTICAL_CENTER, //垂直居中
            ],
        ];

        $sheet->getStyle('A1:' . $cellName[$cellNum - 1] . '1')->getFont()->setBold(true);

        $i = 0;
        foreach ($expCellName as $key => $cell) {
            $sheet->setCellValue($cellName[$i] . '1', $cell);
            $i ++;
        }

        $i = 0;
        foreach ($expTableData as $key=>$item){
            $itemCount=count($item['item']);
            foreach ($item['item'] as $ii=>$goods){
                $data=array_merge($item,$goods);
                $j = 0;
                if($ii===0){
                    foreach ($expCellName as $key => $cell) {
                        if(in_array($key,$mergeCellsName)){
                            $sheet->mergeCells($cellName[$j] . ($i + 2) . ':' . $cellName[$j] . ($i + 2 + $itemCount-1));
                        }
                        $sheet->setCellValue($cellName[$j] . ($i + 2), isset($data[$key])?$data[$key]:'');
                        $j++;
                    }
                }else{
                    foreach ($expCellName as $key => $cell) {
                        if(!in_array($key,$mergeCellsName)){
                            $sheet->setCellValue($cellName[$j] . ($i + 2), isset($data[$key])?$data[$key]:'');
                        }
                        $j++;
                    }
                }

                $i++;
            }
        }
        $sheet->getStyle('A1:' . $cellName[count($expCellName)] . ($i+2))->applyFromArray($styleArray);
        ob_end_clean();
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $fileName . '.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls"); //attachment新窗口打印inline本窗口打印
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->save('php://output');
    }
}

 

posted @ 2022-05-30 10:37  Mr.木易  阅读(669)  评论(0编辑  收藏  举报