php 使用phpoffice导出导出excel

荆轲刺秦王

在PHP中,可以使用 PhpSpreadsheet 库来创建和导出Excel文件。PhpSpreadsheet 是一个纯PHP 编写的组件库,它使用现代 PHP 写法,代码质量和性能比 PHPExcel 高不少,完全可以替代PHPExcel(PHPExcel已不再维护)。使用 PhpSpreadsheet 可以轻松读取和写入Excel文档,支持Excel的所有操作。PhpSpreadsheet 是 PHPExcel 的下一个版本,

首先,通过 Composer 安装 PhpSpreadsheet 库:

composer require phpoffice/phpspreadsheet

需要注意的是,具体引入那个适合自己的版本

PhpSpreadsheet 1.x 系列:这个版本系列是基于 PHP 5.x 的。

PhpSpreadsheet 2.x 系列:这是第一个支持 PHP 7.x 的版本,引入了许多性能改进和新功能。

当然最新的版本已经支持到了php8 这里不做说明。

如果想指定版本则可以,以我本地的 php 5.6 为例:

composer require phpoffice/phpspreadsheet:^1.5

需要注意的是:phpoffice 必须要用 composer 安装,这也更加符合规范,不可以将本地文件夹复制到服务器环境,这是不生效的。

使用起来就更加轻松:

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

结合实际案例,本次的需求是部分列 如果没有数据(合计为0,则不显示):

/*** @return void* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException* */public function ext_hr_tb(){$year_month=$_SESSION['hr_trim']['year_month'];$year=date('Y',strtotime($year_month));$month=(int)date('m',strtotime($year_month));$where_str=" 1=1 ";//月份过滤$where_str .= " and year=" . $year . " and month=" . $month;//考勤计算数据获取$hr_cal_arr = db('hr_cal')->alias('c')->join('sys_user u', 'c.user_id=u.id')->where($where_str)->order('u.site_id asc')->field('c.id,u.user_gh,u.nickname,c.user_id,c.year,c.month,c.last_annual_num,c.last_repair_num,c.holiday_hour,c.local_note_hour,c.local_annual_num,c.tw_out_work_time,c.local_repair_num,c.local_num,c.intern_day,abs(c.casual_leave) as casual_leave,c.sick_leave,c.marry_leave,c.baby_leave,c.over_leave,c.work_err_leave,c.f_baby_leave,c.l_baby_leave,c.work_leave,c.abs_hour,c.bf_num,c.lunch_num,c.remark,c.is_lock')->select();$total_arr = ['holiday_hour_total' => 0,'abs_hour_total' => 0,'marry_leave_total' => 0,'baby_leave_total' => 0,'over_leave_total' => 0,'work_err_leave_total' => 0,'f_baby_leave_total' => 0,'l_baby_leave_total' => 0,];$data = array();foreach ($hr_cal_arr as $key => $val) {$temp_arr = array();$temp_arr['user_gh'] = get_cache_data('user_info', $val['user_id'], 'user_gh');$temp_arr['nickname'] = get_cache_data('user_info', $val['user_id'], 'nickname');$temp_arr['last_annual_num'] = c_z($val['last_annual_num']);$temp_arr['last_repair_num'] = c_z($val['last_repair_num']);$temp_arr['holiday_hour'] = c_z($val['holiday_hour']);$temp_arr['local_note_hour'] = c_z($val['local_note_hour']);$temp_arr['local_annual_num'] = c_z($val['local_annual_num']);$temp_arr['local_repair_num'] = c_z($val['local_repair_num']);$temp_arr['local_num'] = c_z($val['local_num']);$temp_arr['casual_leave'] = c_z($val['casual_leave']);$temp_arr['sick_leave'] = c_z($val['sick_leave']);$temp_arr['marry_leave'] = c_z($val['marry_leave']);$temp_arr['baby_leave'] = c_z($val['baby_leave']);$temp_arr['over_leave'] = c_z($val['over_leave']);$temp_arr['work_err_leave'] = c_z($val['work_err_leave']);$temp_arr['f_baby_leave'] = c_z($val['f_baby_leave']);$temp_arr['l_baby_leave'] = c_z($val['l_baby_leave']);$temp_arr['abs_hour'] = c_z($val['abs_hour']);$temp_arr['intern_day'] = $val['intern_day'];$temp_arr['remark'] = $val['remark'];array_push($data, $temp_arr);$total_arr['holiday_hour_total'] += $temp_arr['holiday_hour'];$total_arr['abs_hour_total'] += $temp_arr['abs_hour'];$total_arr['marry_leave_total'] += $temp_arr['marry_leave'];$total_arr['baby_leave_total'] += $temp_arr['baby_leave'];$total_arr['over_leave_total'] += $temp_arr['over_leave'];$total_arr['work_err_leave_total'] += $temp_arr['work_err_leave'];$total_arr['f_baby_leave_total'] += $temp_arr['f_baby_leave'];$total_arr['l_baby_leave_total'] += $temp_arr['l_baby_leave'];}
//        $header = [
//            'A1'=>'員工工號', 'B1'=>'員工姓名', 'C1'=>'上月結算年休', 'D1'=>'上月結算補休', 'E1'=>'節假日結加班費時數',
//            'F1'=>'本月申請休假', 'G1'=>'本次結算年休時數', 'H1'=>'本次結算補休時數', 'I1'=>'本次年休+補休', 'J1'=>'事假時數',
//            'K1'=>'病假時數', 'L1'=>'曠職時數', 'M1'=>'實習生出勤天數', 'N1'=>'備註', 'O1'=>'婚假',
//            'P1'=>'產假', 'Q1'=>'喪假', 'R1'=>'工傷假', 'S1'=>'陪產假', 'T1'=>'哺乳假'
//        ];//生成header头算法// 使用array_filter筛选出值为0的变量$variablesWithZero = array_filter($total_arr, function ($value) {return $value === 0;});$zeroCount = count($variablesWithZero);$asciiValue = ord('T'); // 输出 84$endCode = chr($asciiValue - $zeroCount);$letters = $this->generateRange('A', $endCode);$b = ['員工工號', '員工姓名', '上月結算年休', '上月結算補休', '節假日結加班費時數','本月申請休假', '本次結算年休時數', '本次結算補休時數', '本次年休+補休', '事假時數','病假時數', '曠職時數', '實習生出勤天數', '備註', '婚假','產假', '喪假', '工傷假', '陪產假', '哺乳假'];if($total_arr['holiday_hour_total'] == 0){unset($b[4]);$data = $this->array_column_remove($data, 'holiday_hour');}if($total_arr['abs_hour_total'] == 0){unset($b[11]);$data = $this->array_column_remove($data, 'abs_hour');}if($total_arr['marry_leave_total'] == 0){unset($b[14]);$data = $this->array_column_remove($data, 'marry_leave');}if($total_arr['baby_leave_total'] == 0){unset($b[15]);$data = $this->array_column_remove($data, 'baby_leave');}if($total_arr['over_leave_total'] == 0){unset($b[16]);$data = $this->array_column_remove($data, 'over_leave');}if($total_arr['work_err_leave_total'] == 0){unset($b[17]);$data = $this->array_column_remove($data, 'work_err_leave');}if($total_arr['f_baby_leave_total'] == 0){unset($b[18]);$data = $this->array_column_remove($data, 'f_baby_leave');}if($total_arr['l_baby_leave_total'] == 0){unset($b[19]);$data = $this->array_column_remove($data, 'l_baby_leave');}$b = array_values($b);$data = array_values($data);$header = array_combine($letters, $b);$this->downExcel($year_month, $header, $data);}/*** @param Request $request* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception*/public function downExcel($year_month, $header, $list_data){//实例化Spreadsheet对象$spreadsheet = new Spreadsheet();//获取活动工作薄$sheet = $spreadsheet -> getActiveSheet();//定义一个excel的header表头//$header = ['A1'=>'ID','B1'=>'昵称','C1'=>'登录名','D1'=>'手机号','E1'=>'邮箱'];foreach ($header as $key=>$value) {$sheet->setCellValue($key,$value);}$i = 2;//excel表格从第2行开始填入数据$keys = array_keys($list_data[0]);foreach ($list_data as $k => $v) {for ($index=1; $index<=count($keys); $index++){$sheet->setCellValueByColumnAndRow($index,$i,$v[$keys[$index-1]]);}//            $sheet->setCellValueByColumnAndRow(1,$i,$v['user_gh']);
//            $sheet->setCellValueByColumnAndRow(2,$i,$v['nickname']);
//            $sheet->setCellValueByColumnAndRow(3,$i,$v['last_annual_num']);
//            $sheet->setCellValueByColumnAndRow(4,$i,$v['last_repair_num']);
//            $sheet->setCellValueByColumnAndRow(5,$i,$v['holiday_hour']);
//
//            $sheet->setCellValueByColumnAndRow(6,$i,$v['local_note_hour']);
//            $sheet->setCellValueByColumnAndRow(7,$i,$v['local_annual_num']);
//            $sheet->setCellValueByColumnAndRow(8,$i,$v['local_repair_num']);
//            $sheet->setCellValueByColumnAndRow(9,$i,$v['local_num']);
//            $sheet->setCellValueByColumnAndRow(10,$i,$v['casual_leave']);
//
//            $sheet->setCellValueByColumnAndRow(11,$i,$v['sick_leave']);
//            $sheet->setCellValueByColumnAndRow(12,$i,$v['abs_hour']);
//            $sheet->setCellValueByColumnAndRow(13,$i,$v['intern_day']);
//            $sheet->setCellValueByColumnAndRow(14,$i,$v['remark']);
//            $sheet->setCellValueByColumnAndRow(15,$i,$v['marry_leave']);
//
//            $sheet->setCellValueByColumnAndRow(16,$i,$v['baby_leave']);
//            $sheet->setCellValueByColumnAndRow(17,$i,$v['over_leave']);
//            $sheet->setCellValueByColumnAndRow(18,$i,$v['work_err_leave']);
//            $sheet->setCellValueByColumnAndRow(19,$i,$v['f_baby_leave']);
//            $sheet->setCellValueByColumnAndRow(20,$i,$v['l_baby_leave']);$i++;//$i从2累加}//定义文件名称,需要带有定义的后缀名$filename = $year_month . '_hr_tb.xlsx';ob_end_clean(); //清除缓冲区,避免乱码//将输出重定向到客户端的web浏览器header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment;filename="' . $filename . '"');header('Cache-Control: max-age=0');//如果浏览器为IE9header('Cache-Control: max-age=1');//如果通过SSL向IE提供服务header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');header('Cache-Control: cache, must-revalidate');//HTTP/1.1header('Pragma: public');//HTTP/1.0$writer = IOFactory ::createWriter($spreadsheet, 'Xlsx');$writer -> save('php://output');exit;}/*** @param $start* @param $end* @param $startNum* @param $endNum* @return array* $range = generateRange('A', 'Z', 1, 1);* print_r($range);*/function generateRange($start = 'A', $end = 'Z', $startNum = 1, $endNum = 1){$results = [];for ($letter = $start; strcmp($letter, $end) <= 0; $letter++) {for ($num = $startNum; $num <= $endNum; $num++) {$results[] = $letter . $num;}}return $results;}function array_column_remove($input, $column_key) {return array_map(function ($item) use ($column_key) {unset($item[$column_key]);return $item;}, $input);}

前面数据列表不再多言,各家业务尽不相同,主要说一下我的思路,首先拿到所有列,然后根据合计是否为0判断 是否删除列。这个时候表头就要做成动态的,动态生成 A1 到 XX 生成函数也放在下面了,题外话:对于 thinkphp5 而言,凡是 composer 安装的插件 一律放到 vendor 目录下,而手动下载的安装包(非composer管理)的,则放到 extend 目录下。

代码筛选列部分还需优化

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

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

相关文章

【HDFS】FSImage加载过程之loadINode过程

普通的loadINode方法(即不是root inode): 根据inode的类型:文件、目录、链接,做不同的加载处理。 // 根据传入的PB INode的type做不同处理。// 我们下面关注FILE和DIRECTORY两种类型:private INode loadINode(INodeSection.INode n) {switch (n.getType()) {<

【云原生】Kubernetes中的List-Watch机制详解与容器生命周期

目录 引言 一、List-Watch机制概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;工作机制 1.List操作 2.Watch操作 &#xff08;三&#xff09;数据流向 1.按模块划分 2.按整体总结 二、Pod生命周期 &#xff08;一&#xff09;生命周期 1.创建…

CMake-1 cmake简介及安装使用

文章目录 1. CMake 简单介绍2. CMake 安装使用 1. CMake 简单介绍 为什么需要CMake 写过C语言的都知道&#xff0c;C语言项目使用Makefile进行管理&#xff0c;而随着项目复杂度的增加 Makefile编写的难度也随之增加&#xff0c;而且在不同平台Makefile 语法规则是不一样的&am…

5款好用的AI写作软件,一键生成高质量文章

在当今信息快速发展的时代&#xff0c;AI写作软件逐渐成为创作者们的得力助手。它们能够凭借先进的技术和算法&#xff0c;一键生成高质量的文章&#xff0c;为创作者们节省大量的创作时间和精力。以下是5款备受好评的AI写作软件&#xff0c;下面在本文中分享给大家&#xff0c…

20240522金融读报:出口信用保险提效苏易融碳中和机票贷款差异化投放替代数据征信培育壮大数字经济

1、印发通知从响应速度、承保力度、承包评审要素、产业链范围、定制化、线上化、便利化等方面去充分发挥出口信用保险作用。&#xff08;这也可以作为这个贷款业务担保时的一个考虑项吧&#xff09; 2、苏易融&#xff1a;汇集江苏辖内特定客群信贷产品&#xff0c;可一站式查…

BitConverter类型,Byte数组与其他基本类型数据之间的转换

BitConvert对于byte数组转换为其他的基本变量很方便&#xff0c;是我们开发必须要学会的类型转换&#xff0c;因为我在使用中使用的比较多&#xff0c;创作不易&#xff0c;大家点赞关注收藏。 GetBytes(XX)将基本变量转换成字节数组&#xff0c;C#在数据存储在计算机中的方式…

kettle学习之表的输入输出

需求 把表A里的数据传送到表B中&#xff0c;在此之前&#xff0c;清空表B内的数据 表输入 执行SQL脚本 表输出

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名&#xff0c;并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器&#xff0c;并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…

探索自动化办公的新境界:批量操作与智能管理

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、自动化办公的必要性与价值 二、基础操作与自动化脚本 三、Python在自动化办公中的应用…

Meme币总市值突破630亿美元 以太坊ETF获批意味着代币化资产“完全安全”

近日&#xff0c;数字货币市场再次掀起轩然大波。一方面&#xff0c;Meme币总市值突破了630亿美元&#xff0c;令人瞠目结舌&#xff1b;另一方面&#xff0c;以太坊ETF的获批也引发了市场的广泛关注&#xff0c;被视为代币化资产的“完全安全”标志。 Meme币总市值飙升 Meme币…

深圳比创达电子EMC|EMC电磁兼容性行业:挑战与机遇并存

随着电子技术的迅猛发展&#xff0c;电磁兼容性&#xff08;EMC&#xff09;已成为各行各业不可忽视的关键问题。EMC是指设备或系统在其电磁环境中能正常工作且不对该环境中任何事物构成不能承受的电磁骚扰的能力。 一、EMC电磁兼容性行业的现状 EMC电磁兼容性行业作为电子技…

[数据集][目标检测]道路井盖下水道井盖开关闭和检测数据集VOC+YOLO格式407张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;407 标注数量(xml文件个数)&#xff1a;407 标注数量(txt文件个数)&#xff1a;407 标注类别…

构建php环境、安装、依赖、nginx配置、ab压力测试命令

目录 php简介 官网php安装包 选择下载稳定版本 &#xff08;建议使用此版本&#xff0c;文章以此版本为例&#xff09; 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…

深入理解一下栈

1、栈&#xff1a;数据结构 为什么 main()方法 最先执行&#xff0c;最后结束&#xff1f; 当然是因为 main()方法入栈啦。 2、栈&#xff1a;栈内存&#xff0c;主管程序的运行&#xff0c;生命周期和现成同步&#xff1b; 线程结束&#xff0c;栈内内存也就释放了&#xff0c…

STM32_RCC

1、RCC RCC即Reset and Clock Control&#xff0c;复位和时钟控制。通过stm32f10x结构图可以看出RCC控制着stm32的AHB系统总线&#xff0c;而AHB总线又桥接APB1和APB2&#xff0c;分别通过它们控制不同的片上外设。如果要使用某个片上外设的功能&#xff0c;必须先通过…

SpringBoot集成腾讯IM流程

1.application.yaml中添加IM配置信息 #im模块 im: identifier: admin sdkappid: 1400888888 key: ccf2dc88c1ca232cfabbd24906d5091ab81ba0250224abc 2.封装IM工具类 Component Getter RefreshScope public class ImAdminSignConfig {/*** 签名*/private String usersig;…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新&#xff0c;追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

CDGP|数据治理策略揭秘:因企制宜,实现精准管控新高度

随着信息化、数字化的深入推进&#xff0c;数据已经成为企业最重要的资产之一。如何高效、安全地管理和利用数据&#xff0c;成为企业面临的重要课题。数据治理策略的制定与实施&#xff0c;成为解决这一问题的关键所在。本文将探讨如何因企制宜&#xff0c;制定符合企业实际情…

23种设计模式全面总结 | 快速复习(附PDF+MD版本)

本篇文章是对于23种设计模式的一个全面的总结&#xff0c;受限于文章篇幅无法对每个设计模式做到全面的解析&#xff0c;但几乎每个设计模式都提供了案例和类图结构&#xff0c;非常适合快速复习和在学习设计模式之前的全预习把握。 &#x1f4a1;文章的 pdf markdown 版本可通…

Mysql的复制技术

一、异步复制&#xff1a; 主服务器上的事务更新了数据后&#xff0c;就不管从服务器是否立刻跟上&#xff0c;主服务器继续处理其他事务&#xff0c;而从服务器会在它空闲的时候去检查并应用这些更新。 ——老师&#xff08;源服务器&#xff09;给学生&#xff08;从服务器&…