tp5封装的execl导出

  public function BillDownload($data){
        $this->RequestData['list_rows']=self::$maxDataLength;
        $result = $data;
        $map=['charge_code'=>"Charge","curr_type"=>"Units","unit_rate"=>"Price","unit_num"=>'Quantity',
            "amount"=>"Amount"];
        $priceFunc = function($v){return number_format($v, 2, '.', '');};
        $this->width = [20,20,20,20,30];
        $callableList = ['unit_rate'=>$priceFunc];
        $this->createBillFile('Bill'.toDate(null,"Y-m-d").'.xlsx',$result??[],$map,$callableList);

    }

    /**
     * @param $fileName 文件名
     * @param $data 导出的数据
     * @param $field 字段
     * @param array $callback 过滤函数
     * @throws \PhpOffice\PhpSpreadsheet\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
     */
    protected function createBillFile($fileName,$data,$field,$callback=[]){
        ini_set("memory_limit",'256M');
        ini_set('max_execution_time','300s');
        Header("Content-Type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Content-Disposition: attachment; filename=".$fileName);
        header("Access-Control-Allow-Origin:*");
        header("Access-Control-Allow-Methods:GET,POST,OPTIONS");
        header("Access-Control-Allow-Credentials:true");
        $sheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        //设置列宽
        if(isset($this->width) && is_array($this->width)){
            $char = chr(65+ count($this->width));


            if($char<='Z'){
                $pos ="A";
                foreach ($this->width as $v){
                    $sheet->getActiveSheet()->getStyle("{$pos}1")->getFont()->setBold(true);
                    $sheet->getActiveSheet()->getColumnDimension($pos)->setWidth($v);

                    $pos++;
                }
            }
        }

        $sheetField = array_flip(array_keys($field));
        $convertData=[];
        array_walk($data,function($item,$key) use(&$convertData,$callback,$sheetField){
            $item = array_filter($item,function($k)use($sheetField){return isset($sheetField[$k]);},ARRAY_FILTER_USE_KEY);
            $item = array_merge($sheetField,$item);
            $convertData[$key]=$item;
            foreach($callback as $name=>$func) {
                if (array_key_exists($name, $item)) {
                    $convertData[$key][$name] = $func($item[$name]);

                }
            }
        });
        unset($data);
        $sheet->getActiveSheet()->fromArray(array_values($field),null,'A1');
        $sheet->getActiveSheet()->fromArray($convertData, null, 'A2');

        //设置居中
        $sheet->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);
        $max = $sheet->getActiveSheet()->getHighestRowAndColumn();
        $styleArray = [
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        $sheet->getActiveSheet()->getStyle('A1:'.$max['column'].$max['row'])->applyFromArray($styleArray);

        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($sheet, "Xlsx");
        $writer->save("php://output");
        $sheet->disconnectWorksheets();
        unset($sheet);
        exit;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值