php 使用phpoffice导出导出excel

2024-05-25 16:04

本文主要是介绍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 目录下。

代码筛选列部分还需优化

这篇关于php 使用phpoffice导出导出excel的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础