java excel导出内存溢出怎么解决 (php导出excel不完整)

phpexcel导出,phpexcel导入大数据

专题1:PHPExcel的疑难杂症各个击破

本文使用了一个轻量级的PHP的Excel操作库-PHP_XLSXWriter

phpexcel导出,phpexcel导入大数据一.解决行的问题

  • 10w行excel数据导出仅需要5.26秒,再也不用担心excel导出超过1w行就超时(php.ini中的maxexecutiontime)

  • 内存栈溢出,使用过PHPExcel的同学应该清楚,导出的文件行还没到1w行就报错了,原因是单个PHP进程超过了 php.ini配置的memory_limit

  • 解决了csv导出时样式丢失,长数字变成科学计数法的问题,乱码的问题

  1. <? php

  2. #使用轻量级的excel操作库PHP_XLSXWriter

  3. $timeStart = microtime ( true );

  4. require_once __DIR__ . "/../PHP_XLSXWriter/vendor/autoload.php" ;

  5. $writer = new XLSXWriter ();

  6. $sheetHeader = [

  7. '商品id' => 'string' ,

  8. '库存量' => 'string' ,

  9. '单价' => 'string' ,

  10. '名称' => 'string' ,

  11. '卖家联系电话' => 'string' //长数字再也不用担心会变成科学计数法了

  12. ];

  13. $writer -> writeSheetHeader ( 'Sheet1' , $sheetHeader ); //optional

  14. for ( $i = 0 ; $i < 100000 ; $i ++)

  15. {

  16. $s1 = $i + 1 ;

  17. $s2 = mt_rand ( 0 , 1000 );

  18. $s3 = mt_rand ( 100 , 999 )/ 10 ;

  19. $s4 = "商品" . $s1 ;

  20. $s5 = "13713147601" ; //随便输入的

  21. $writer -> writeSheetRow ( 'Sheet1' , array ( $s1 , $s2 , $s3 , $s4 , $s5 ) );

  22. }

  23. $writer -> writeToFile ( 'goods_info.xlsx' );

  24. echo floor (( memory_get_peak_usage ())/ 1024 / 1024 ). "MB" ;

  25. echo "" ;

  26. echo microtime ( true ) - $timeStart ;

源码地址:https://gitee.com/nodestudy/The-PHP-Best-Practice

文件目录结构:

phpexcel导出,phpexcel导入大数据

一.解决列的问题

最近有个需求,THINKPHP3.2中对数据进行导出,数据一共有43项,导出时候就会抱错 Invalid cell coordinate [1

因为phpexcel 的cell.php里默认就设置了26列,而且判断方法里默认从a-z然后下一个列就是aa1了 ,而实际上在excel里z后面应该是AA,AB,AC,AD,AE,AF这样 所以需要改判断方法,我之前写过一篇excel的导出,只需要吧其中一个方法改动一下,改动的思想就是 当超过26列的时候 下一列命名应该是AA,AB,而不是 aa1,AA2,改进方法如下

phpexcel导出,phpexcel导入大数据

1、将列的字母转成数字序号使用,代码如下:


  1. $phpExcel = new PHPExcel();

  2. //$array需要导出的数组

  3. foreach($array as $k => $value){

  4. $title_col = PHPExcel_Cell::stringFromColumnIndex($k); // 从0开始 A-Z,AA,AB...

  5. $phpExcel->getActiveSheet()->setCellValue($title_col."1",$value);//标题行 A1-Z1,AA1,AB1...

  6. }

2、将列的数字序号转成字母使用,代码如下:

PHPExcel_Cell::columnIndexFromString('AA');