專題1:PHPExcel的疑難雜癥各個擊破
本文使用了一個輕量級的PHP的Excel操作庫-PHP_XLSXWriter
一.解決行的問題
10w行excel數(shù)據(jù)導出僅需要5.26秒,再也不用擔心excel導出超過1w行就超時(php.ini中的maxexecutiontime)
內(nèi)存棧溢出,使用過PHPExcel的同學應該清楚注簿,導出的文件行還沒到1w行就報錯了汛闸,原因是單個PHP進程超過了 php.ini配置的memory_limit
-
解決了csv導出時樣式丟失击喂,長數(shù)字變成科學計數(shù)法的問題捍靠,亂碼的問題
<?php
#使用輕量級的excel操作庫PHP_XLSXWriter
$timeStart = microtime(true);
require_once __DIR__."/../PHP_XLSXWriter/vendor/autoload.php";
$writer =newXLSXWriter();
$sheetHeader =[
? ?'商品id'=>'string',
? ?'庫存量'=>'string',
? ?'單價'=>'string',
? ?'名稱'=>'string',
? ?'賣家聯(lián)系電話'=>'string'//長數(shù)字再也不用擔心會變成科學計數(shù)法了
];
$writer->writeSheetHeader('Sheet1', ?$sheetHeader);//optional
for($i=0; $i<100000; $i++)
{
? ?$s1 = $i+1;
? ?$s2 = mt_rand(0,1000);
? ?$s3 = mt_rand(100,999)/10;
? ?$s4 ="商品".$s1;
? ?$s5 ="13713147601";//隨便輸入的
? ?$writer->writeSheetRow('Sheet1', array($s1, $s2, $s3, $s4, $s5));
}
$writer->writeToFile('goods_info.xlsx');
echo floor((memory_get_peak_usage())/1024/1024)."MB";
echo "
";
echo microtime(true)-$timeStart;
源碼地址:https://gitee.com/nodestudy/The-PHP-Best-Practice
文件目錄結(jié)構(gòu):
一.解決列的問題
最近有個需求,THINKPHP3.2中對數(shù)據(jù)進行導出羽氮,數(shù)據(jù)一共有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,改進方法如下
1视译、將列的字母轉(zhuǎn)成數(shù)字序號使用,代碼如下:
$phpExcel = new PHPExcel();
//$array需要導出的數(shù)組
foreach($array as $k => $value){
$title_col = PHPExcel_Cell::stringFromColumnIndex($k); // 從0開始 A-Z,AA,AB...
$phpExcel->getActiveSheet()->setCellValue($title_col."1",$value);//標題行??A1-Z1,AA1,AB1...
}
?
2、將列的數(shù)字序號轉(zhuǎn)成字母使用,代碼如下:
PHPExcel_Cell::columnIndexFromString('AA');