fastadmin的导出到excel功能

fastadmin,excel · 浏览次数 : 0

小编点评

以下是根据您提供的信息整理的解决图片在Excel中循环导出问题的代码示例: ```php alias('site') ->field('staff.staff_name,asite.code,asite.code,site_name,site.latlng,site.check_lnglat,site.checktime,site.images') ->join('inspection_staff staff','staff.id = site.staff_id','LEFT') ->join('inspection_area_site asite','asite.id = site.area_site_id','LEFT') ->where('status',1) ->order(['site.checktime' => 'desc']) ->select(); // 初始化Excel文件 $spreadsheet = new Spreadsheet(); $worksheet = $spreadsheet->getActiveSheet(); // 设置表头名称和单元格大小等样式 $title = ['巡检员', '巡检点编号', '巡检点名称', '巡检经纬度', '打卡经纬度', '打卡时间', '打卡图片']; $cell_width = [15, 10, 25, 20, 20, 20, 25, 30, 10, 10, 30, 10, 20, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 15, 15, 10]; $titCol = 'A'; // 写入表头 foreach ($title as $k => $value) { $worksheet->setCellValue($titCol . '1', $value); if (isset($cell_width[$k])) { $worksheet->getColumnDimension($titCol)->setWidth($cell_width[$k]); } $titCol++; } // 设置单元格样式 $styleArray = [ 'font' => [ 'bold' => true ], 'alignment' => [ 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, ], ]; $worksheet->getStyle('A1:V1')->applyFromArray($styleArray); // 循环写入数据 $rowIndex = 2; foreach ($dataList as $dataRow) { $colIndex = 'A'; $maxImageCount = !empty($dataRow['images']) ? count(explode(',', $dataRow['images'])) : 1; foreach ($dataRow as $key => $value) { $worksheet->getStyle($colIndex . $rowIndex)->getAlignment()->setWrapText(true); if ($key == 'images' && !empty($value)) { $imagePaths = explode(',', $value); foreach ($imagePaths as $index => $image) { $cellCoordinate = $colIndex . ($rowIndex + $index); $hyperlinkText = "打卡图" . ($index + 1); $worksheet->setCellValue($cellCoordinate, $hyperlinkText); $worksheet->getCell($cellCoordinate)->getHyperlink()->setUrl(trim($image)); } } else { $worksheet->setCellValue($colIndex . $rowIndex, $value); $worksheet->mergeCells($colIndex . $rowIndex . ':' . $colIndex . ($rowIndex + $maxImageCount - 1)); } $colIndex++; } $rowIndex += $maxImageCount; } // 导出Excel文件 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'. $filename . date("Y-m-d", time()) . '.xlsx"'); header('Cache-Control: max-age=0'); $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->save('php://output'); } } ``` 请注意,这段代码可能需要根据您的具体项目环境和需求进行调整。在使用之前,请确保已经正确安装并加载了 PhpOffice\PhpSpreadsheet 类库。 另外,为了防止Excel文件名被覆盖,可以在文件名中添加当前时间戳,如下所示: ```php filename: '巡检记录' . date("Y-m-d", time()) . '.xlsx' ``` 希望这段代码能帮助您解决图片循环导出问题。如果您还有其他问题,请随时提问。

正文

正常的excel导出没什么问题,最近一直头疼的是怎么导出数据中包含图片,并且图片还是数组?????by user 悦悦 https://www.cnblogs.com/nuanai

1、导出的excel布局是图片分行显示

2、导出图片路径,并且已另外的文字设置超链接

3、其他行合并(这个还没有想好怎么设置合并后赋值)

使用的框架是fastadmin,就要引入必要的PhpOffice包,不必介绍,其中使用到了导出excel的文件、超链接文件、单元格样式文件  by user 悦悦 https://www.cnblogs.com/nuanai

1 use PhpOffice\PhpSpreadsheet\Spreadsheet;
2 use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
3 use PhpOffice\PhpSpreadsheet\Writer\Xls;
4 
5 use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
6 use PhpOffice\PhpSpreadsheet\Style\Alignment;

使用sql语句将数据库需要导出的数据进行查询成结果集,正常的查询语句不做过多介绍(控制器命名不做过多介绍,懂得都懂哈)

这里使用的连表查询,查询出需要导出的字段;有时间字段的,如果数据库中存的是时间戳,需要进行格式化后赋值   by user 悦悦 https://www.cnblogs.com/nuanai

 1 $dataList = Db::name('inspection_project_site')
 2             ->alias('site')
 3             ->field('staff.staff_name,asite.code,asite.code,site_name,site.latlng,site.check_lnglat,site.checktime,site.images')
 4             ->join('inspection_staff staff','staff.id = site.staff_id','LEFT')
 5             ->join('inspection_area_site asite','asite.id = site.area_site_id','LEFT')
 6             ->where('status',1)
 7             ->order(['site.checktime'=>'desc'])
 8             ->select();
 9             
10 foreach ($dataList as $k => &$v)
11 {
12     $v['checktime'] = isset($v['checktime']) ? date('Y-m-d H:i:s',$v['checktime']) : "";
13 }

需要导出的字段已经有了,那么下面就是进行excel的工程,想要导出excel就要使用到上面引入的PHPoffice包

设置导出excel表的文件名称、表头名称和单元格大小等样式,可以使用数据库字段,也可以自己先设定好,我这边是提前设定好的   by user 悦悦 https://www.cnblogs.com/nuanai

 1 $filename = '巡检记录';
 2 $spreadsheet = new Spreadsheet();
 3 $worksheet = $spreadsheet->getActiveSheet();
 4 
 5 $title = ['巡检员','巡检点编号','巡检点名称','巡检经纬度','打卡经纬度','打卡时间','打卡图片'];
 6 $cell_width = [15,10,25,20,20,20,25,30,10,10,30,10,20,10,10,10,10,20,20,20,20,20,20,20,15,15,10];
 7 
 8 $titCol = 'A';// 表头单元格内容 第一行
 9         
10 foreach ($title as $k=>$value) {
11     // 单元格内容写入
12     $worksheet->setCellValue($titCol . '1', $value);
13     if (isset($cell_width[$k])){
14         $worksheet->getColumnDimension($titCol)->setWidth($cell_width[$k]);
15     }
16     $titCol++;
17 }
18         
19 $styleArray = [
20     'font' => [
21         'bold' => true
22     ],
23     'alignment' => [
24         'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
25     ],
26 ];
27 //设置单元格样式
28 $worksheet->getStyle('A1:V1')->applyFromArray($styleArray)->getFont()->setSize(12);        

配置好基本要素后,就是数据内容的写入了,这边图片的字段是用“逗号”进行拼接的字符串,所以当写入excel中时,需要判断图片字段进行逗号拆分为数组,然后分条写入excel表中  by user 悦悦 https://www.cnblogs.com/nuanai

让我比较头疼的是,之前的循环写入有点错误,大家一定要注意,循环的顺序。错误是图片写入后,又被下一条的数据给覆盖了,所以一定要计算好图片需要用到多少行,并且下一条写入时要图片的行数+1才不会覆盖上一条的图片

1 $maxImageCount = !empty($dataRow['images']) ? count(explode(',', $dataRow['images'])) : 1;   //这是判断图片字段是否为空,下面会在合并时用到
1 //这是超链接的名称显示,不想直接显示路径显示另外的名称
2 $hyperlinkText = "打卡图" . ($index + 1); 
3 //先写入再这是值为超链接
4 $worksheet->setCellValue($cellCoordinate, $hyperlinkText);
5 // 设置超链接
6 $worksheet->getCell($cellCoordinate)->getHyperlink()->setUrl(trim($image));
1 //除了图片单元格外,其他的单元格列合并图片所占的行数
2 $worksheet->mergeCells($colIndex . $rowIndex . ':' . $colIndex . ($rowIndex + $maxImageCount - 1));

上面是设置超链接和合并的编写内容,下面进行循环写入excel,需要注意的是要在结果集的foreach外设置开始的行数,里面进行设定开始的列;然后进行结果集的循环判断图片字段,并且循环完后才能进行行数追加

 1 $rowIndex = 2;
 2 foreach ($dataList as $dataRow) {
 3     $colIndex = 'A';
 4     $maxImageCount = !empty($dataRow['images']) ? count(explode(',', $dataRow['images'])) : 1;
 5     
 6     foreach ($dataRow as $key => $value) {
 7         $worksheet->getStyle($colIndex.$rowIndex)->getAlignment()->setWrapText(true);  // 设置自动换行
 8         
 9         if ($key == 'images' && !empty($value)) {
10             $imagePaths = explode(',', $value);
11             foreach ($imagePaths as $index => $image) {
12                 //$worksheet->setCellValue($colIndex . ($rowIndex + $index), trim($image));
13                 $cellCoordinate = $colIndex . ($rowIndex + $index);
14                 $hyperlinkText = "打卡图" . ($index + 1);
15                 $worksheet->setCellValue($cellCoordinate, $hyperlinkText);
16                 // 设置超链接
17                 $worksheet->getCell($cellCoordinate)->getHyperlink()->setUrl(trim($image));  
19             }
20         } else {
21             $worksheet->setCellValue($colIndex .$rowIndex, $value);
22             $worksheet->mergeCells($colIndex . $rowIndex . ':' . $colIndex . ($rowIndex + $maxImageCount - 1));
23         }
24         $colIndex++;
25     }
27     $rowIndex += $maxImageCount;
28 }

写入完毕后,再进行excel文件的导出  by user 悦悦 https://www.cnblogs.com/nuanai

1 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
2 header('Content-Disposition: attachment;filename="'.$filename.date("Y-m-d",time()).'.xlsx"'); //文件名+当前时间命名,可以防止被覆盖
3 header('Cache-Control: max-age=0');
4 $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
5 $writer->save('php://output');

到这里终于解决的图片循环导出的难题,还有一些excel的其他格式设置等,我没有设置超链接的颜色等   by user 悦悦 https://www.cnblogs.com/nuanai

1 //默认B列隐藏
2 $worksheet->getColumnDimension('B')->setVisible(false); 
3 
4 // 将值以字符串类型写入单元格
5 $worksheet->setCellValueExplicit($titCol2.$i, $v, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

by user 悦悦 https://www.cnblogs.com/nuanai

与fastadmin的导出到excel功能相似的内容: