最近在操作PHP导出Excel,一开始同步生成,后来直接来了个异步生成。当然这里面牵扯到最多的 还是时间的优化。 本文总结了我在使用php生成excel过程中的选型和数据处理优化建议
-
php生成Excel有现成的类库
phpexcel
但是已经不维护了 支持php5.3至php5.6;phpspreadsheet
这个还是很不错的,但是在我的使用中发现数据量大时不可用,php5.6以上可用fputcsv()
excel的一种格式 数据量大时是一种很好的解决办法
-
根据以上三个 可以对数据生成总的说来就是分为两种,那我们如何选择呢
- 如果使用php类库,建议将php升级到最新的php7版本节省内存,且计算速度要快
- 如果使用php类库,建议使用最新的phpspreadsheet,官方在更新,有保障
- 如果不是用php类库,那么
fputcsv()
是最佳方式
- 我为什么选择csv
- csv文件较小
- csv文件数据可存放数量可大可小
- csv生成不占用大量cpu和时间,而excel的生成时间随着文件数据量的增加成幂指数曲线,我指的时间已经排除了数据处理的时间,我粗略计算了下在我的服务器上(阿里云ecs 2核cpu php已经跑满100%cpu)生成29900条左右的excel在数据处理完后耗时近30分钟,csv的生成随着数据处理进行,数据处理完就生成文件了。
-
如何优化数据处理的时间
- 在数据循环时,减少嵌套循环
- 生成csv或者excel的数据对象时,一次成型,减少数据库查询次数,如果需要用到其他数据请提前生成相应数据结构的数据
-
csv中的数据处理,确保中文显示,数字不会展示为科学记数法
- 中文如何处理
mb_convert_encoding($str, 'gbk', 'utf8')
这样确保csv使用Excel打开后能够正常展示中文字符 - 数字如何处理 如手机号身份证号
'shenfenzheng' => '="300000000000003333"',
通过=
强制单元格的内容为字符串
- 中文如何处理