去评论
dz插件网

[phpoffice]导出excel时带上图片,通用方法

饾暦饾枎饾枒饾枏饾枂饾枅饾枑
2023/04/21 15:51:29
最近运营的一些产品需求,总是要求有商品的地方要把商品图片一块导出到excel。所以写了一个功能相对通用的方法。

首先先将phpoffice必须要用到的命名空间引入进来:
  1. use PhpOffice\PhpSpreadsheet\Exception;
  2. use PhpOffice\PhpSpreadsheet\IOFactory;
  3. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  4. use PhpOffice\PhpSpreadsheet\Style\Fill;
  5. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  6. use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
  7. use PhpOffice\PhpSpreadsheet\style\Border;
  8. use PhpOffice\PhpSpreadsheet\style\Alignment;
  9. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

调用方法:


exportNew方法核心代码:
  1.     exportNew(array $title, array $body, string $filename='', array $ext=[],  string $export_type='xlsx')
  2.     {
  3.         if(empty($title)){
  4.             exit('表头数据为空');
  5.         }
  6.         if(empty($body)){
  7.             exit('导出数据为空');
  8.         }
  9.         $title1 = array_keys($title);//字段名称
  10.         $title2 = array_values($title);//列表头
  11.         //生成列对应的数据字段名称
  12.         foreach($title1 as $k => $v){
  13.             $letter = intToChr($k);
  14.             $title1_new[$letter] = $v;
  15.         }
  16.         unset($title1);
  17.         //生成excel的表头
  18.         foreach($title2 as $k => $v){
  19.             $letter = intToChr($k);
  20.             $title2_new[$letter] = $v;
  21.         }
  22.         unset($title2);
  23.         //超大数据导出
  24.         set_time_limit(0);
  25.         //使用模板
  26.         $spreadsheet = new Spreadsheet();
  27.         //表格对象
  28.         $worksheet = $spreadsheet->getActiveSheet();
  29.         //画表头
  30.         $startRow  = 1;
  31.         foreach($title2_new as $k => $v){
  32.             $width = 12;
  33.             if(!empty($ext['column_width'])   && is_array($ext['column_width'])  ){
  34.                 foreach($ext['column_width']  as $k2 => $v2){
  35.                     $key   = array_search($k2, $title1_new);
  36.                     if($k == $key){
  37.                         $width = $v2;
  38.                     }
  39.                 }
  40.             }
  41.             $worksheet->getColumnDimension($k)->setWidth($width);//列宽
  42.             $styleArray = [
  43.                 'borders' => [
  44.                     'outline' => [
  45.                         'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
  46.                         'color' => ['argb' => '00000000'],
  47.                     ],
  48.                 ],
  49.                 'fill' => [
  50.                     'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_LINEAR,
  51.                     'rotation' => 90,
  52.                     'startColor' => [
  53.                         'argb' => '76933C',
  54.                     ],
  55.                     'endColor' => [
  56.                         'argb' => '76933C',
  57.                     ],
  58.                 ],
  59.                 'alignment' => [
  60.                     'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  61.                     'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
  62.                 ],
  63.             ];
  64.             $worksheet->getStyle($k.$startRow)->applyFromArray($styleArray);
  65.             $worksheet->setCellValue($k.$startRow, $v);
  66.             $worksheet->getRowDimension($startRow)->setRowHeight(25);
  67.         }
  68.         //画数据体
  69.         foreach($body['list'] as $k => $v){//行
  70.             $row = $startRow + $k + 1;
  71.             foreach($title1_new as $k2 => $v2){//列
  72.                 if(empty($ext['image']['column'][$v2])){
  73.                     $worksheet->setCellValue($k2.$row, $v[$v2]);
  74.                 }else{
  75.                     $drawing = new Drawing();
  76.                     //$drawing->setName($val['name']);
  77.                     //$drawing->setDescription($val['name']);
  78.                     $imgval = $v[$v2];
  79.                     $imgurl = explode('?', $imgval)[0];
  80.                     $fullfilename = $ext['image']['dir'] . basename($imgurl);
  81.                     $tmp_img_arr[] = $fullfilename;
  82.                     if(!is_file($fullfilename)){
  83.                         continue;
  84.                     }
  85.                     $drawing->setPath($fullfilename);//注意,这里的$fullfilename必须为本地图片,如果图片在网上需要先下载下来
  86.                     $drawing->setHeight(80);
  87.                     //$drawing->setWidth(50);
  88.                     $drawing->setCoordinates($ext['image']['column'][$v2] . $row);
  89.                     $drawing->setWorksheet($worksheet);
  90.                     //设置行高
  91.                     $worksheet->getRowDimension($row)->setRowHeight(60);
  92.                     unset($drawing);
  93.                 }
  94.             }
  95.             unset($body['list'][$k]);
  96.         }
  97.         //创建文件
  98.         $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  99.         //下载表格
  100.         $filename = empty($filename) ? date('Y-m-d_H-i', time()) : $filename;
  101.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  102.         header('Content-Disposition: attachment;filename="' . $filename  . '.xlsx"');
  103.         header('Cache-Control: max-age=0');//禁止缓存
  104.         $writer->save('php://output');
  105.         //释放资源防止内存溢出
  106.         $spreadsheet->disconnectWorksheets();
  107.         unset($spreadsheet, $writer);
  108.         exit();
  109.     }
注意:$fullfilename必须为本地图片,如果你的图片是在阿里云或者七牛,需要先将这些图片下载到本地,不能实时取网上图片,否则程序运行相当慢,还可能导致图片取不到程序报错。

导出的excel效果:

如果还不清楚如何使用,请到群里问群主。