fastadmin的导出到excel功能
正常的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功能的更多相关文章
- 织梦自定义表单导出为excel功能
1.首先在后台修改/dede/templets/diy_main.htm <a href="../plus/diy.php?action=daochu&diyid={dede: ...
- DataTable 更改在有数据列的类型方法+DataTable 导出excel功能
/// <summary> /// 导出功能 /// </summary> /// <param name="sender"></para ...
- VB将MSHFlexGrid数据导出到Excel文件通用功能
1.通用导出Excel功能. 2.将 MSHFlexGrid数据导出到Excel文件通用功能. 3.具体代码如下: '将下列代码保存到一模块文件中,调用方法:Export fgrid1,cd1 Pub ...
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
- 项目笔记:导出Excel功能
1.前台这块: var ids=""; $.post("${basePath}/assets/unRegDeviceAction_getDeviceIds.do" ...
- 项目笔记:导出Excel功能分sheet页插入数据
导出Excel功能分sheet页处理数据: /*导出EXCEL*/ public void createExcel() { log.info("导出Excel功能已经启动-BEGIN&quo ...
- vue项目导出EXCEL功能
因为一些原因导出EXCEL功能必须前端来做,所以就研究了一下,在网上也找了一些文章来看,有一些不完整,我做完了就记录下来,供大家参考: 1.首先先安装依赖: npm install file-save ...
- Vue通过Blob对象实现导出Excel功能
不同的项目有不同的导出需求,有些只导出当前所显示结果页面的表格进入excel,这个时候就有很多插件,比如vue-json-excel或者是Blob.js+Export2Excel.js来实现导出Exc ...
- .net 导出Excel功能
将DataSet对象导出成Excel文档 一.不带格式控制 void btnExport_Click(object sender, EventArgs e) { IList<string> ...
- excel导出、导入功能
public class ExcelHelper { #region 数据导出至Excel文件 /// </summary> /// web导出Excel文件,自动返回可下载的文件流 // ...
随机推荐
- [Mobi] Android Studio arm 模拟器
从右下角 Configure 打开 AVD Manager. 点击 "Create New Device" 来创建新设备 选择TV 接着Next,然后用 Other Imag ...
- 在 UOS 统信运行 dotnet 程序提示没有通过系统安全验证无法运行
本文记录 dotnet 应用程序在 UOS 统信系统上运行时,提示 没有通过系统安全验证,无法运行 的问题 这个问题是因为没有开启 UOS 统信的开发者模式,直接将自己构建完成的包放上去跑导致的问题 ...
- 为何 WPF 对 vcruntime140 有引用
通过阅读 WPF 官方开源仓库的代码和文档,可以了解到在进行独立发布的时候会在仓库里面带上 vcruntime140 的原因 在独立发布的时候,可以在仓库里面找到 vcruntime140.dll 这 ...
- SonarQube+Maven+SonarQube Scanner
1.SonarQube简介 官方网站地址:https://www.sonarqube.org/ SonrQube是一个开源的代码质量管理系统,用于检测代码中的错误,漏洞和代码规范.它可以以现有的Git ...
- RT-Thead的启动流程
一.RT-Thread启动流程 由于RT-Thread文档中心已经将得很详细了,这里我就不过多描述,有需要的可以看RT-Thread 文档中心,启动流程如下图所示: 从图中可以看出RT-Thread是 ...
- js实现懒加载原理
概念:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载.原理:当图片元素的偏移高度<=设备高度+滚动条与 ...
- Dijkstra迪杰斯特拉求最短路和最短路的条数和各个点权值的最大值
作为一个城市的紧急救援队队长,你会得到一张你所在国家的特殊地图. 该地图显示了由一些道路连接的几个分散的城市. 地图上标出了每个城市的救援队伍数量以及任意两个城市之间每条道路的长度. 当其他城市接到紧 ...
- 二:大数据架构回顾-Kappa架构
Kappa 架构是由 LinkedIn 的前首席工程师杰伊·克雷普斯(Jay Kreps)提出的一种架构思想.克雷普斯是几个著名开源项目(包括 Apache Kafka 和 Apache Samza ...
- 02、Linux 排查
Linux 分析排查 1.敏感文件信息 1.1.tmp 目录 /tmp:临时目录文件,每个用户都可以对它进行读写操作.因此一个普通用户可以对 /tmp 目录执行读写操作(ls -alt) 筛查 /tm ...
- mod操作符效率高吗?
编程语言中mod取余操作符%的效率不是很高,比如M = N % 10,它花费得时间本机测试是1ms,而如果使用M = N - N / 10 * 10,则只需要0.1ms. 所以平时变成得时候,可以尽量 ...