当前位置: 首页 > news >正文

PhpSpreadsheet表格导出

个人笔记记录

使用PhpSpreadsheet 导出excel。

多重表头生成excel 表

    //读取数据库public function demo1(){// 连接数据库$config = Config::get('databaseedc');$db = Db::connect($config);$data =$db->name("xxxx")->alias('a')->field('main_header, sub_header,fvi_value')->join('')->where('')->select();$this->exportDataToExcel($data);}
    // 将数据转换为Excel格式并保存function exportDataToExcel($data) {//从初始化表格$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();// 处理数据和表头$mainHeaders = $this->getMainHeaders($data);//提取次级表头和数据$subHeadersAndData = $this->getSubHeadersAndData($data);// 设置表头$this->setHeaders($sheet, $mainHeaders, $subHeadersAndData);//设置Excel的数据$currentRow = 2;//初始行$col=1; //初始列//循环主表头foreach ($mainHeaders as $subData){//循环次级表头和数据foreach ($subHeadersAndData as $subHeaderKey => $subHeaderData) {// 获取主表头部分$mainHeaderPart = explode('_', $subHeaderKey)[0];//查找于当前表头一致的数据if($mainHeaderPart==$subData){echo("<pre>");print_r($subHeaderKey);//设置子标题:$sheet->setCellValueByColumnAndRow($col, $currentRow, $subHeaderData['sub_header']);//设置子标题相关的数据foreach ($subHeaderData['data'] as $index => $value) {$sheet->setCellValueByColumnAndRow($col, $currentRow + $index + 1, $value);}$col++;}}}// 保存文件$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');$filename = './excel/' . date('YmdHis') . '.xlsx'; // 使用动态文件名避免冲突$result = $writer->save($filename);}
    //从数据中提取主表头public function getMainHeaders($data) {$mainHeaders = [];foreach ($data as $item) {//检查 main_header 是否已在 $mainHeaders 中if (!in_array($item['main_header'], $mainHeaders)) {//不存在,加入数组$mainHeaders[] = $item['main_header'];}}return $mainHeaders;}
    //从数据中提取次级表头和数据function getSubHeadersAndData($data) {$subHeaders = [];//存储处理后的子标题及其相关数据$rowData = [];foreach ($data as $item) {$subHeaderKey = $item['main_header'] . '_' . $item['sub_header'];//检查 $subHeaders 数组中是否已经存在该子标题键if (!isset($subHeaders[$subHeaderKey])) {$subHeaders[$subHeaderKey] = ['sub_header' => $item['sub_header'],'data' => []];}//$item 中的 'fvi_value' 添加到与该子标题关联的 'data' 数组中。$subHeaders[$subHeaderKey]['data'][] = $item['fvi_value'];}return $subHeaders;}

getSubHeadersAndData 中的数组如下。 “主表头_次级表头” 为了方便记录次级表头所属的表头是哪个。
sub_header:次级表头
data:当前列的内容。
在这里插入图片描述

    //设置Excel的表头function setHeaders($sheet, $mainHeaders, $subHeadersAndData) {//从第一行第一列开始$col = 1;$row = 1;//遍历主标题foreach ($mainHeaders as $mainHeader) {//设置主标题$sheet->setCellValueByColumnAndRow($col, $row, $mainHeader);//计算与当前主标题相关的子标题数量$subHeadersCount = count(array_filter(array_keys($subHeadersAndData), function($key) use ($mainHeader) {return strpos($key, $mainHeader . '_') === 0;}));//合并单元格if ($subHeadersCount > 0) {$sheet->mergeCells(Coordinate::stringFromColumnIndex($col) . $row . ':' . Coordinate::stringFromColumnIndex($col + $subHeadersCount - 1) . $row);}//更新列索引:$col += $subHeadersCount;}}

第一行是主表头。第二行是次级表头。
在这里插入图片描述

补充

对其方式
靠右:HORIZONTAL_RIGHT
靠左:HORIZONTAL_LEFT
居中:HORIZONTAL_CENTER

 // 设置该单元格左对齐
$style = $sheet->getStyleByColumnAndRow($col, $currentRow);
$style->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);//合并单元格// 合并单元格,例如合并A1到B2的区域  
//方法1
$sheet->mergeCells('A1:B2');//方法2
$col = 1;//列
$row = 1;//行
//Coordinate::stringFromColumnIndex($col) //将起始列的数值索引转换为列名。
//. $row //将行号附加到列名的后面,形成起始单元格的完整坐标(如 'A1')。
//Coordinate::stringFromColumnIndex($col + $subHeadersCount - 1) //将结束列的数值索引(起始列加上需要合并的列数减 1)转换为列名。
//. $row //同样将行号附加到结束列的列名后面,形成结束单元格的完整坐标。$sheet->mergeCells(Coordinate::stringFromColumnIndex($col) . $row . ':' . Coordinate::stringFromColumnIndex($col + $subHeadersCount - 1) . $row);

相关文章:

  • 一种基于高德Web API实现沿路画面的实现
  • 54.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(2)
  • 从 URL 中获取数据并创建列表解析
  • ch5链路层和局域网
  • java基础filter servlet interceptor controller之间的关系
  • Python 怎么注释大段
  • 操作失败——后端
  • 华为、华三交换机、路由器启用基于端口的环回检测功能配置
  • Python怎么翻译:探索Python在翻译领域的无限可能
  • gitlab将本地文件项目上传至gitlab服务
  • 微电子加速迈向后摩尔时代!复旦大学梅永丰课题组集成 DNN 与纳米薄膜技术,精准分析入射光角度
  • 计算机基础(5)——进制与进制转换
  • 明天15点!如何打好重保预防针:迎战HVV经验分享
  • python11 序列的相关操作
  • Unity 性能优化之LOD技术(十)
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Android 架构优化~MVP 架构改造
  • Android交互
  • AWS实战 - 利用IAM对S3做访问控制
  • C# 免费离线人脸识别 2.0 Demo
  • CEF与代理
  • JSDuck 与 AngularJS 融合技巧
  • Lsb图片隐写
  • Promise面试题,控制异步流程
  • React系列之 Redux 架构模式
  • Redis 懒删除(lazy free)简史
  • SpiderData 2019年2月23日 DApp数据排行榜
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 第十八天-企业应用架构模式-基本模式
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 区块链将重新定义世界
  • 如何利用MongoDB打造TOP榜小程序
  • 跳前端坑前,先看看这个!!
  • 微信小程序实战练习(仿五洲到家微信版)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • linux 淘宝开源监控工具tsar
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 国内开源镜像站点
  • 我们雇佣了一只大猴子...
  • ​马来语翻译中文去哪比较好?
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #Linux(make工具和makefile文件以及makefile语法)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (zhuan) 一些RL的文献(及笔记)
  • (层次遍历)104. 二叉树的最大深度
  • (二)fiber的基本认识
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (力扣)循环队列的实现与详解(C语言)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .bat批处理(一):@echo off
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net mvc总结
  • .NET 某和OA办公系统全局绕过漏洞分析