PhpSpreadsheet导出Excel文件空白问题解决

在一个项目中集成了PhpSpreadsheet,试图将平台的部分数据导出为Excel,为此专门封装了一个Office服务组件。但是好巧不巧导出的Excel文件竟然是空白的。如下图所示:

PhpSpreadsheet导出Excel文件空白问题

Tp-admin框架中Office组件源码参考:https://gitee.com/zkii_admin/Tp-admin/blob/master/extend/service/OfficeService.php

其中有个导出Excel文件的方法是这样写的。

  1. /**
  2.      * 导出Excel2
  3.      * @param $list Array 数据列
  4.      * @param $filename String 文件名
  5.      * @param $title String 标题
  6.      * @param $keys Array 字段与说明
  7.      */
  8.     public function toExcelWithHead($list,$filename,$title,$keys){
  9.         $sheet = new Spreadsheet();
  10.         $begin = 1;
  11.         $filename = empty($filename) ? time().".xlsx" : $filename.".xlsx";
  12.         $keymap = array_column($keys,'notes');
  13.         $filedmap = array_column($keys,'fields');
  14.         $col_num = sizeof($keymap);
  15.         if(!empty($title)){
  16.             $sheet->getProperties()->setTitle($title);
  17.             $sheet->getActiveSheet()->setCellValue('A1',$title);
  18.             $sheet->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  19.             $sheet->getActiveSheet()->mergeCells('A1:'.self::$cellKey[$col_num-1].'1');
  20.             $begin +=1;
  21.         }
  22.         if(!empty($keymap)){
  23.             for($i=0;$i<$col_num;$i++){
  24.                 $sheet->getActiveSheet()->getStyle(self::$cellKey[$i].$begin)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  25.                 $sheet->setActiveSheetIndex(0)->setCellValue(self::$cellKey[$i].$begin,mb_convert_encoding($keymap[$i],'utf-8'));
  26.             }
  27.             $begin +=1;
  28.         }
  29.         $leng = sizeof($list);
  30.         for($row = 0;$row < $leng;$row++){
  31.             $j = $row+$begin;
  32.             for($t=0;$t<$col_num;$t++){
  33.                 $sheet->getActiveSheet()->setCellValueByColumnAndRow($t+1,$j,mb_convert_encoding($list[$row][$filedmap[$t]],'utf-8'));
  34.             }
  35.         }
  36.         ob_end_clean();
  37.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  38.         header('Content-Disposition: attachment; filename="' . $filename . '"');
  39.         header('Cache-Control: max-age=0');
  40.         $writer = IOFactory::createWriter($sheet, 'Xlsx');
  41.         $writer->save('php://output');
  42.     }

经过排查后发现是传入$keys数据格式不正确导致的,$keymap的元素个数为0,导致第一行没有元素,输出Excel成空白文件。

后来传入$keys格式变成如下格式的数组,输出Excel正常。

  1. array(
  2.     array("fields"=>"id","notes"=>"序号");
  3.     array("fields"=>"name","notes"=>"名称");
  4.     ...
  5. );

 

波波
你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!