php导出excel的优化方案

最近在操作PHP导出Excel,一开始同步生成,后来直接来了个异步生成。当然这里面牵扯到最多的 还是时间的优化。 本文总结了我在使用php生成excel过程中的选型和数据处理优化建议

  1. php生成Excel有现成的类库

    1. phpexcel 但是已经不维护了 支持php5.3至php5.6;
    2. phpspreadsheet 这个还是很不错的,但是在我的使用中发现数据量大时不可用,php5.6以上可用
    3. fputcsv() excel的一种格式 数据量大时是一种很好的解决办法
  2. 根据以上三个 可以对数据生成总的说来就是分为两种,那我们如何选择呢

    1. 如果使用php类库,建议将php升级到最新的php7版本节省内存,且计算速度要快
    2. 如果使用php类库,建议使用最新的phpspreadsheet,官方在更新,有保障
    3. 如果不是用php类库,那么fputcsv()是最佳方式
  3. 我为什么选择csv
    1. csv文件较小
    2. csv文件数据可存放数量可大可小
    3. csv生成不占用大量cpu和时间,而excel的生成时间随着文件数据量的增加成幂指数曲线,我指的时间已经排除了数据处理的时间,我粗略计算了下在我的服务器上(阿里云ecs 2核cpu php已经跑满100%cpu)生成29900条左右的excel在数据处理完后耗时近30分钟,csv的生成随着数据处理进行,数据处理完就生成文件了。
  4. 如何优化数据处理的时间

    1. 在数据循环时,减少嵌套循环
    2. 生成csv或者excel的数据对象时,一次成型,减少数据库查询次数,如果需要用到其他数据请提前生成相应数据结构的数据
  5. csv中的数据处理,确保中文显示,数字不会展示为科学记数法

    1. 中文如何处理 在没有使用BOM的时候 可以通过转换字符编码方法处理 mb_convert_encoding($str, 'gbk', 'utf8') 这样确保csv使用Excel打开后能够正常展示中文字符
    2. 数字如何处理 如手机号身份证号 'shenfenzheng' => '="300000000000003333"', 通过=强制单元格的内容为字符串
    3. 使用了BOM 后会解决一下问题 (注意使用了BOM后一定不要进行字符编码转换)

      如图
      这个出问题的字是这样写的 kun (kūn)
      他在Excel中不会正常识别

      1
      2
      3
      4
      5
      $fp = fopen($this->path . $filename, 'x+');
      //输出BOM信息
      fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
      //输出单行数据``
      fputcsv($fp, $fieldsName);
  • Post author: hainuo
  • Post link: php-export-data-to-excel
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.