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

PhpSpreadsheet创建带复杂表头的excel数据

目录

一:背景

二:excel表头数据实现

三:excel渲染数据实现:

四:最终效果如下:


一:背景

最近需要统计一些数据,导出到excel,主要是一些区域的人员销售统计数据,涉及到复杂的表头和数据合并,我们使用PhpSpreadsheet这个excel操作库很容易就实现了,记录一下实现过程。

二:excel表头数据实现

表头有两行数据,前几列是两行合并,后几列是按照两行显示具体如下:

首先我们把表头展示实现:

     
          $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet;
           $sheet = $spreadsheet->getActiveSheet();
            
            $header =   [
         
            ['大区','省','销售员','一月','','二月','','三月',''],
            ['','','','推广数量','销售额','推广数量','销售额','推广数量','销售额',])
        ];
        
      
        $row = 1;
        foreach ($header as $value) {
            $col = 1;
            foreach ($value as $v) {
                $sheet->setCellValueByColumnAndRow($col, $row, $v);
                $col += 1;
            }
            $row += 1;
        }

合并单元格:

       $cellValue = $sheet->getCell('A2')->getValue();
        $sheet->mergeCells('A2:A3');
        $sheet->setCellValue('A2', $cellValue);

        $cellValue = $sheet->getCell('B2')->getValue();
        $sheet->mergeCells('B2:B3');
        $sheet->setCellValue('B2', $cellValue);

        $cellValue = $sheet->getCell('C2')->getValue();
        $sheet->mergeCells('C2:C3');
        $sheet->setCellValue('C2', $cellValue);

         $sheet->mergeCells('E2:F2');
         $sheet->setCellValue('E2', '一月');
         $sheet->mergeCells('G2:H2');
         $sheet->setCellValue('G2', '二月');

          $sheet->mergeCells('I2:J2');
          $sheet->setCellValue('I2', '三月');

设置样式:

 $styleArray = [
            'borders' => [
                'outline' => [
                    'borderStyle' => Border::BORDER_THICK, // 边框样式
                    'color' => ['argb' => 'red'], // 边框颜色
                ],
                'bottom' => [
                    'borderStyle' => Border::BORDER_THIN, // 下边界线:细线
                    'color' => ['argb' => 'red'], // 边框颜色
                ],
            ],
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_CENTER,
                'vertical' => Alignment::VERTICAL_CENTER,
            ],
            'fill' => [
                'fillType' => Fill::FILL_SOLID,
                'startColor' => [
                    'rgb' => 'ff9900'
                ]
            ],
            'font' => [
                'bold' => true,
                'color' => [
                    'rgb' => '000000'
                ]
            ],
        ];

$sheet->getStyle('A2:AB2')->applyFromArray($styleArray);

三:excel渲染数据实现:

实现逻辑是,获取每个省的销售员数据,去循环渲染,如果是同一个省,省列的单元格合并,如果是同一个区,大区列的单元格合并

     //根据销售员销售数据
            $row = $areaStart =  $provinceStart = 4;
            $col = 3;
            $monthCol = [7,9,11,13,15,17,19,21,23,25,27,29];//12个月的销售起始列
            foreach ($areaDeptArr as $areaName => $areaValue) {
                foreach ($areaValue as $provinceName => $value) {
                    foreach ($value as $v) {
                        $sheet->setCellValueByColumnAndRow($col, $row, $v['user_name']);
                        
                        //填充销售数据
                        foreach ($monthCol as $m => $mValue) {
                            
                            $lastCol = $mValue + 1;
                            $sheet->setCellValueByColumnAndRow($mValue, $row, 0);
                            $sheet->setCellValueByColumnAndRow($lastCol, $row, 0);
                            
                        }
                        
                        $row+= 1;
                    }
                    //设置省区名称
                    $sheet->mergeCells('B'.$provinceStart.':B'.($row-1));
                    $sheet->setCellValue('B'.$provinceStart, $provinceName);
                    $provinceStart = $row;
                }

                //设置大区名称
                $sheet->mergeCells('A'.$areaStart.':A'.($row-1));
                $sheet->setCellValue('A'.$areaStart, $areaName);
                $areaStart = $row;
            }

            $excelName = '业务员销售数据.xlsx';
            $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
            $writer->save($excelName);

四:最终效果如下:

相关文章:

PhpSpreadsheet创建带复杂表头的excel数据

目录 一:背景 二:excel表头数据实现 三:excel渲染数据实现: 四:最终效果如下: 一:背景 最近需要统计一些数据,导出到excel,主要是一些区域的人员销售统计数据,涉及到复杂的表头和…...

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1: 安装Burp Suite。官网链接:Burp Suite官网 step2: 设置代理 step3: 如果要拦截https请求,还需要在客户端安装证书 step4: 拦截到请求可以在Proxy ->…...

洞察云上风险,主机安全尽在掌握

在实战攻防演练中,主机一直是攻击方的最终目标。作为网络架构中的重要组成部分,主机包含了大量的敏感数据、关键服务和系统资源。同时主机拥有网络资源的访问权限,攻击者通过入侵主机获得权限,进而控制整个网络或系统。因此做好主…...

使用kimi编辑助手,开始搭建一个微信小程序!第一天

为什么开源?因为不开源,一个人开发小程序,一点突如其来的变故就会导致自己整体处于一个不舒服的状态,同时自己从0开始1开始搭建小程序,也是自己个体之间能力的验证! 目前小程序版本:2.5.2 目前…...

【已解决】libev not found

学习韦东山老师的Linux应用开发实验班的JSON部分,在编译JSON包的过程中 报错命令: ./configure --hostarm-buildroot-linux-gnueabihf -prefix$PWD/tmp 错误信息: checking for libev support... checking for arm-buildroot-linux-gnue…...

qt QVariant详解

QVariant是Qt框架中一个功能强大的变体类,它提供了一种通用的方式来存储Qt对象及其他类的值,能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性:QVariant可以存储几乎所有数据类型,包括基本数据类型(如…...

再获殊荣!通付盾当选信息技术应用创新工作委员会技术活动单位称号

近日,通付盾凭借其在信息技术应用创新领域的卓越贡献和突出表现,荣获“信息技术应用创新工作委员会技术活动单位”称号。这一荣誉不仅是对通付盾在技术创新和信息安全领域努力的肯定,更是对其在推动国家信息技术应用创新发展中发挥重要作用的…...

PostgreSQL模板数据库template0和template1的异同点

PostgreSQL模板数据库 PostgreSQL有两个模板数据库:template0和template1,template0是不可修改的,而template1是可以修改的。 那模板数据库有什么作用呢?顾名思义,当做模板。 其实我们创建数据库 CREATE DATABASE 其…...

手机ip切换成全局模式怎么弄

在当今数字化时代,智能手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开它的陪伴。随着网络技术的不断发展,手机IP地址的切换技术也逐渐走进大众视野,中,“全局模式” 作为IP切…...

前端学习笔记(1.0)

在开发项目时,需要使用符号来代替书写./和../等麻烦的路径书写,所以就遇到了下面的问题。 输入没有路径提示 我们都知道,设置是通过配置vite等脚手架工具的配置文件,设置别名即可。 但是如果需要在使用的时候需要出现路径提示&…...

推动TMS-EEG数据预处理标准化

摘要 将非侵入性脑刺激(NIBS)技术与脑电生理活动记录相结合是神经科学领域广泛使用的方法。同时结合经颅磁刺激(TMS)与脑电图(EEG)尤其成功。但是,为了有效地与大脑活动进行交互,所需的强磁脉冲不可避免地会在同步EEG采集过程中产生伪影。因此&#xff…...

国产电脑能装win系统吗_国产电脑安装windows要求及方法

国产电脑能装win系统吗?‌国产电脑可以安装Windows系统,但需要满足特定条件。‌‌目前只有CPU基于X86架构国产电脑才可以安装windows。下面小编就和大家一起来分析下国产电脑安装windows要求及方法。 国产电脑能装win系统吗? 答:‌国产电脑可…...

C#Winform的控件基类Control

C# Winform中,所有控件都继承自Control类,这个类提供了许多关键属性和事件,以及字段,它们是构建Windows窗体应用程序的基础。以下是对Control类的一些关键属性和事件以及字段的介绍: 关键属性 Anchor:获取…...

汽车电子行业的LIMS:提升质量与效率的关键助力

汽车电子行业的蓬勃发展,得益于汽车智能化、电动化的趋势不断推进。从先进的车载娱乐系统到复杂的电子控制单元,汽车电子产品的质量直接关系到整车的性能、安全和用户体验。因此,严格的检测和质量控制成为汽车电子企业不可或缺的环节。LIMS在…...

移动端面试问题笔记(一)

1. 1pxborder的问题 原因: 设备像素比不同 从移动端的角度说个具体的场景,以iphone6为例。 iphone6的屏幕宽度为375px,设计师做的视觉稿一般是750px,也就是2x,这个时候设计师在视觉稿上画了1px的边框,于是你就写了“bo…...

从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能

目录 一、模型配置操作:cfg.__init__.py 1.cfg.cfg2dict:yaml转字典 2.cfg.get_cfg:读取覆盖配置 3.cfg全局配置参数查询表 ①*基础参数配置: ②*训练参数配置: ③验证测试参数配置: ④*预测参数配置&…...

【数据库设计】逻辑结构设计

E-R实体集的转换 概念结构设计之后就是对E-R图进行逻辑结构设计:即将E-R图转化成关系的过程。逻辑结构设计主要用于数据库管理系统上,为了让数据在计算机系统中更好地表示。 此设计过程用到的数据模型有:除了前面讲过的关系模型还有层次模型…...

uni-app之旅-day07-购物车页面

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 9.1 商品列表区域9.1.1 渲染购物车商品列表的标题区域9.1.2 渲染商品列表区域的基本结构9.1.3 为 my-goods 组件封装 radio 勾选状态9.1.4 为 my-goods 组件封装 ra…...

【机器学习】并行计算(parallel computation)Part2

Asynchronous Parallel Gradient Descent Using Parameter Server 用Parameter Server实现异步并行梯度下降 Parameter Server这种编程模型可以实现异步并行梯度下降,架构采用的是Client-Server,通信方式是Message-passing,同步方式是异步的…...

AI学习指南深度学习篇-迁移学习的应用场景

AI学习指南深度学习篇 - 迁移学习的应用场景 引言 迁移学习(Transfer Learning)是一种强有力的技术,尤其在深度学习领域的应用越来越广泛。通过在一个领域学到的知识来帮助另一个领域的学习,迁移学习尤其适用于数据稀缺的场景。…...

【web前端设计】jquery图标动画特效

学习目标 学习web前端设计技术(HTML、css、JavaScript、jQuery等),综合运用技术,将其与HTML元素结合,设计样式、监听事件、添加动画等,给用户呈现出更好的视觉交互效果。本文主要学习分页按钮自动放大、元…...

Linux——用户/用户组

创建用户组groupadd groupadd 用户组 删除用户组groupdel groupdel 用户组 创建用户useradd useradd 用户名 - g 用户组 useradd 用户名 -d HOME路径 删除用户userdel userdel 用户 userdel -r 用户 (删除用户的 HOME 目录,不使用 -r &#xff0…...

HDFS上传下载命令

hadoop <组件> -<操作> /path1/test.txt / path2 上传&#xff1a;hadoop fs -put /path1/test.txt / path2 下载&#xff1a;hadoop fs -get /path2/test.txt / path3 查看目录&#xff1a;hadoop fs -ls / 查看文件&#xff1a;hadoop fs -cat / path…...

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备&#xff1a; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器&#xff0c;监听指定的端口获取以GET、POST、JSON等方式上传的数据&#xff0c;并回应驱动读卡…...

基于python的《C语言程序设计》课程成绩分析

作者:Svan.声明&#xff1a;未经本人允许&#xff0c;不得对本文中的任何内容、数据进行转载&#xff0c;本人&#xff08;作者&#xff09;已经对本文内容申请撰写了论文&#xff0c;随意转载使用本文任何内容的&#xff0c;要追究其法律责任&#xff01;&#xff01;&#xf…...

@Component 和 @Bean 的区别与联系

相同点&#xff1a; Component 和 Bean 是两种使用注解来定义bean的方式。 Component和Bean的目的是一样的&#xff0c;都是注册bean到Spring容器中。 两者都可以通过Autowired装配 不同点&#xff1a; Component 和 它的子类型&#xff08;Controller, Service and Reposit…...

高手炒现货黄金短线的方法

现货黄金短线交易的精髓在于“计划你的交易”。短线交易不是临时起意的赌博&#xff0c;也不是盘口随意的追涨杀跌&#xff0c;而是所有因素分析以后的结果。新手进行短线操作容易流为频繁的随意操作&#xff0c;导致成功率不高。但当投资者有了准备&#xff0c;短线交易就再也…...

后端:唯一ID有哪些生成方式

文章目录 在后端开发中的ID生成策略1. 数字型 ID特点&#xff1a;优点&#xff1a;缺点&#xff1a;例子&#xff1a;常见用法&#xff1a; 2. UUID&#xff08;通用唯一标识符&#xff09;特点&#xff1a;优点&#xff1a;缺点&#xff1a;例子&#xff1a;常见用法&#xff…...

LabVIEW提高开发效率技巧----高精度延时

在LabVIEW开发中&#xff0c;时间控制是许多应用中的关键环节&#xff0c;尤其是高精度应用中&#xff0c;时钟漂移会严重影响程序的准确性。为此&#xff0c;使用Wait Until Next ms Multiple来代替简单的Wait (ms)&#xff0c;可以显著减少时钟漂移&#xff0c;确保高精度延时…...

<Link><Link> 和 <a> </a>标签的区别

1. Link (React Router)&#xff1a; 作用: Link 是 react-router-dom 提供的组件&#xff0c;用于在 React 应用中创建前端路由跳转。它不会导致页面重新加载。优点: 无刷新跳转: 使用 Link 进行导航时&#xff0c;React 的路由器会捕获并处理链接&#xff0c;避免浏览器的全…...