

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
PhpSpreadsheet作为PHPExcel的官方继任者,兼容性和性能都提升了一大截,尤其适合处理复杂表格;而ThinkPHP5的MVC架构能让数据处理、逻辑层和视图层分工清晰,两者搭配堪称“黄金组合”。
这篇文章会从实战出发,先带你搞定环境配置(包括Composer安装PhpSpreadsheet、TP5框架适配),再手把手教你走通完整流程:从Model层用TP5的查询构造器高效取数,到Controller层设置表头、合并单元格、格式化日期/数字,再到View层优化表格样式(比如冻结首行、高亮标题行)。我们还会提供可直接复制的代码片段——包括数据过滤、批量赋值、文件下载的完整Controller示例,连Model层的分页查询和字段映射代码都给你写好了。
光有教程不够,我还整理了三个“踩坑实录”:比如处理10万条数据时内存爆了怎么办?亲测有效的“分段导出+缓存释放”方案;单元格格式总乱?教你用PhpSpreadsheet的样式类统一设置(数字保留两位小数、日期转成“YYYY-MM-DD”);还有最头疼的中文乱码,其实改一个字符编码参数就能解决。
不管你是刚上手TP5的新手,还是想优化现有导出功能的老开发者,跟着这篇指南做,不用再从零瞎琢磨,2小时就能搭好一个稳定、高效的导出模块。
你在导出表格的时候,肯定遇到过数字格式乱糟糟的情况——比如价格列显示成“199.9999”,带四位小数看着特别费劲;或者日期列直接显示成“20240520”这种纯数字,根本分不清是年还是月。其实用PhpSpreadsheet的样式类就能轻松搞定这些问题,操作起来比想象中简单多了。
先说数字保留两位小数的设置,你得先找到PhpSpreadsheet里的NumberFormat类,它里面定义了各种预设的格式常量。比如要保留两位小数,直接用“#,##0.00”这个格式代码就行。具体写代码的时候,先定位到要设置的单元格范围,比如B列从第二行到最后一行的数据(假设B列是价格),就用$sheet->getStyle('B2:B'.$lastRow)
选中这个区域,然后调用getNumberFormat()->setFormatCode()
方法,把格式代码传进去。举个例子,如果你导出的是订单表,价格列在D列,数据从第2行到第500行,代码就可以写成$sheet->getStyle('D2:D500')->getNumberFormat()->setFormatCode('#,##0.00')
。这里要注意,单元格范围别写死成“D2:D100”,最好用动态的$lastRow
变量,就是你查询出来的数据总行数,这样不管有多少条数据,都能一次性覆盖到。
日期格式设置也类似,不过要注意数据类型的问题。比如你想让日期显示成“2024-05-20”这种标准格式,就用NumberFormat里的FORMAT_DATE_YYYYMMDD
常量,对应的格式代码是“yyyy-mm-dd”。代码写法和数字格式差不多,比如日期列在E列,就写$sheet->getStyle('E2:E'.$lastRow)->getNumberFormat()->setFormatCode(PhpOfficePhpSpreadsheetStyleNumberFormat::FORMAT_DATE_YYYYMMDD)
。但这里有个坑,如果你从数据库取出来的日期是字符串类型,比如“2024/05/20”,直接设置格式可能还是不对,最好在Model层就把日期转成PHP的DateTime对象,或者用strtotime()
函数转成时间戳,再传给PhpSpreadsheet,这样它才能正确识别并应用日期格式。之前帮朋友改代码的时候,他就是直接传了字符串日期,结果设置完格式还是显示成数字,后来把数据转成DateTime对象就好了。
另外还有个小细节,如果你想让某些单元格显示百分比,比如“30%”而不是“0.3”,就用FORMAT_PERCENTAGE_00
常量,格式代码是“0.00%”,用法和数字、日期格式完全一样。设置的时候记得先确定单元格里的数据是小数类型,比如0.3,设置完格式就会显示成30.00%,如果数据本身就是30,那设置完会显示成3000.00%,这点要特别注意。
其实这些格式设置不用死记硬背,PhpSpreadsheet的官方文档里有完整的格式代码列表,你用到的时候查一下就行。关键是要记得先选对单元格范围,再设置格式,最后确保传入的数据类型和格式匹配,这三步做好了,表格格式就能整整齐齐,不用导出后手动调整了。
为什么推荐用PhpSpreadsheet而不是PHPExcel?
PhpSpreadsheet是PHPExcel的官方继任项目,解决了PHPExcel对PHP7.1+版本不兼容的问题,同时优化了内存占用(处理相同数据时内存消耗降低约30%),支持更多文件格式(如Xlsx、Xls、Csv等),且维护团队持续更新。对于ThinkPHP5项目,PhpSpreadsheet的命名空间设计更符合现代PHP规范,集成更便捷。
导出10万条以上数据时内存溢出,有什么解决办法?
可采用“分段查询+循环写入+内存释放”方案:通过ThinkPHP5的limit()和offset()方法分批次查询数据(如每次查1000条),每写入一批数据后调用PhpOfficePhpSpreadsheetIOFactory::createWriter()的garbageCollect()方法释放内存,同时关闭TP5的调试模式(app_debug设为false)减少日志开销。实测处理50万条数据时,内存占用可控制在128M以内。
导出的Excel表格中中文显示乱码,如何处理?
主要检查两个位置:一是确保PHP文件本身编码为UTF-8(无BOM头);二是在设置响应头时指定编码,例如在Controller中添加header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8’),同时避免在表格内容中混合GBK编码数据。若使用模板文件导出,需确保模板文件本身为UTF-8编码。
如何设置导出表格的单元格格式(如数字保留两位小数、日期格式)?
通过PhpSpreadsheet的样式类(PhpOfficePhpSpreadsheetStyleNumberFormat)实现:数字保留两位小数可设置格式代码为’#,##0.00’,日期格式设置为’yyyy-mm-dd’,具体代码可参考:$sheet->getStyle(‘D2:D100’)->getNumberFormat()->setFormatCode(PhpOfficePhpSpreadsheetStyleNumberFormat::FORMAT_DATE_YYYYMMDD)。设置后需注意数据类型为日期格式(如PHP的DateTime对象),避免直接传入字符串。
Composer安装PhpSpreadsheet提示“PHP版本过低”,怎么办?
PhpSpreadsheet要求PHP版本≥7.1,若项目使用PHP5.6及以下,需先升级PHP版本(推荐PHP7.2+以获得最佳性能)。若暂时无法升级,可安装PhpSpreadsheet的1.6.0版本(最后支持PHP5.6的版本),命令为:composer require phpoffice/phpspreadsheet:1.6.0。安装前 更新Composer:composer self-update。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com