PhpSpreadsheet表格导出

news2024/11/18 20:41:29
个人笔记记录

使用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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Win系统安装 Ubuntu20.04子系统 WSL2 (默认是C盘,第7步开始迁移到D盘,也可以不迁移)

1、简介 WSL在Windows 10上原生运行Linux二进制可执行文件&#xff0c;不用单独安装虚拟机。 WSL2是WSL的第二个版本&#xff0c;提供了与WSL相比的显著性能改进和完全的系统呼叫兼容性。通过运行Linux内核在一个轻量级虚拟机&#xff08;VM&#xff09;中实现。 2、安装 电…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识&#xff0c;BOM&#xff0c;作业手顺&#xff08;工艺路线&#xff09;&#xff0c;作业区&#xff08;工作中心&#xff09;&#xff0c;MRP&#xff0c;MPS等概念&#xff0c;现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM&#xff0c;派生BO…

将单列数据帧转换成多列数据帧

文章目录 1. 查看数据文件2. 读取数据文件得到单例数据帧3. 将单列数据帧转换成多列数据帧 在本次实战中&#xff0c;我们的目标是将存储在HDFS上的以逗号分隔的文本文件student.txt转换为结构化的Spark DataFrame。首先&#xff0c;使用spark.read.text读取文件&#xff0c;得…

金融行业数字化上云及信创改造过程中的一些问题及解决方案|合集①

Q&#xff1a;对金融机构来讲&#xff0c;什么是一切业务运行的前提&#xff1f; 金融机构的业务连续性对系统的稳定性要求极高。任何系统故障都可能导致严重的业务中断和经济损失。因此&#xff0c;金融机构需要IT基础架构能够提供高稳定性的服务&#xff0c;确保业务的连续运…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段&#xff0c;区&#xff0c; 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件&#xff0c;主要用于存储记录、索引等数据&#xff0c;一个mysql实例可有多个表空间&#xff0c;甚至能通过innodb…

.NET周刊【6月第1期 2024-06-02】

国内文章 一文带你了解.NET能做什么&#xff1f; https://www.cnblogs.com/Can-daydayup/p/18214473 .NET是一个免费、开源、跨平台的开发平台框架&#xff0c;广泛应用于桌面、Web、移动、云服务、游戏、物联网、大数据和人工智能等领域开发。它支持C#、Visual Basic、F#等…

SSL代码签名最佳实践

代码签名就是软件发布者使用全球可信的证书颁发机构CA颁发的代码签名证书对软件代码进行签名&#xff0c;由此来验证软件开发者的真实身份&#xff0c;确保软件代码的完整性和可信任性。然而&#xff0c;攻击者一直试图渗透代码签名&#xff0c;意将恶意软件嵌入可信代码中。由…

finalshell刚连上就断,这个参数你注意到了吗

在实际应用中可能一不下心弄错一个参数就会让你的finalshell刚连上就断&#xff0c;如下图所示。 1、进入ssh目录下&#xff0c;修改ssh_config文件 2、修改UseDNS no,并把前面的#去掉。 注&#xff1a;如果在ssh_config文件见不到UseDNS yes ,可以打开sshd_config,他们是在…

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

Java学习笔记 集合的使用

在实际的项目中开发过程中&#xff0c;会有很多的对象&#xff0c;如何高效、方便的管理这些对象&#xff0c;是影响程序性能与可维护性的重要环节。在Java语言中为这个问题提供了一套完美的解决方案&#xff0c;也就是接下来要介绍的集合框架。 1.1 集合框架的结构 从Collect…

什么是 Batch Normalization 批标准化和全连接层

Batch Normalization 神经元在经过激活函数之后会处于饱和状态&#xff0c;无论后续怎么变化都不会再起作用。 每一层都会进行batch normalization的处理&#xff01; without normalization 会导致数据分布再饱和区 全连接层&#xff1a; 全连接层(fully connected layers&a…

DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf 此部分转自:https://zhuanlan.zhihu.com/p/616314276 1.mbuf结构 mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。 mbuf:报文内存存储结构,存储在mempool中mempool:使用环形缓冲…

【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录 一、Ingress 简介 1.1service的作用 1.2外部访问方案 (四种&#xff09;&#x1f339;&#x1f339;&#x1f339; 部署externalIPs 1.3Ingress 是什么 二、Ingress 组成&#x1f339;&#x1f339;&#x1f339; 三、Ingress 工作原理&#x1f431;&#x1f…

一维时间序列信号的小波时间散射变换(MATLAB 2021)

小波散射变换的目的在于获取第一层次的特征信息&#xff0c;即免疫平移、轻微形变的信息。而低通的滤波器能够获取输入信号的概貌&#xff0c;获取反映其整体大尺度特征的信息&#xff0c;以图像为例&#xff0c;由低通滤波器选取的信号对于图像的平移、伸缩、旋转等局部变化有…

【QT5】<总览二> QT信号槽、对象树及样式表

文章目录 前言 一、QT信号与槽 1. 信号槽连接模型 2. 信号槽介绍 3. 自定义信号槽 二、不使用UI文件编程 三、QT的对象树 四、添加资源文件 五、样式表的使用 六、QSS文件的使用 前言 承接【QT5】&#xff1c;总览一&#xff1e; QT环境搭建、快捷键及编程规范。若存…

计算机发展史 | 从起源到现代技术的演进

computer | Evolution from origins to modern technology 今天没有参考资料哈哈 PPT&#xff1a;&#xff08;评论区&#xff1f;&#xff09; 早期计算工具 算盘 -算盘是一种手动操作的计算辅助工具&#xff0c;起源于中国&#xff0c;迄今已有2600多年的历史&#xff0c;是…

告别鼠标:蓝牙无线安卓模拟鼠标,绘图板,手写板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们&#xff0c;上链接了&#xff1a;https://download.csdn.net/download/jasonhongcn/89387887 横屏模式&#xff1a; 竖屏模式&#xff1a; 操作说明&#xff1a; 1. 手势滑动模拟鼠标移动 2. 界面如果有滚动条&#xff0c;右手指按紧&#xff0c;通过左手指移动实现…

智慧医疗新纪元:可视化医保管理引领未来

在数字化浪潮席卷全球的今天&#xff0c;我们的生活正在经历前所未有的变革。其中&#xff0c;智慧医保可视化管理系统就像一股清新的风&#xff0c;为医疗保障领域带来了全新的活力与可能。 想象一下&#xff0c;在繁忙的医院里&#xff0c;患者和家属不再需要为了查询医保信息…

适合航天航空的国产FTP替代软件

在宇宙探索的旅程中&#xff0c;航空和航天领域总是站在科技的最前沿&#xff0c;对数据传输的要求特别高。随着信息量急剧增加和安全威胁的复杂化&#xff0c;传统的FTP软件已经不能满足这个高端领域的需要了。因此&#xff0c;找到一款适合航空和航天领域的FTP替代软件&#…

SQLServer 查询指定数据库名和表名及表结构等

查询当前数据库中所有表名&#xff0c;不用指定数据库&#xff0c;选中某数据库直接执行SQL就好 -- U:所有用户表名; S:所有系统表名;V:所有视图表名 SELECT name FROM sysobjects WHERE xtypeU OR xtypeS OR xtypeV 查询指定数据库数据库中所有表名&#xff0c; SELECT TAB…