老话题了...求助PHP导出EXCEL,phpexcel类很强大,但是效率低速度慢,fputcsv速度快但不知道怎么解决科学计数法的问题,求老司机传授经验
本帖最后由 anyilaoliu 于 2014-08-20 16:39:12 编辑 如题...
导出的数据目前大约4W条 下个月可能有10W条 4W条的情况下最终导出大约20M 因为字段较多所以循环对每一条数据做了一些处理计算, 用PHPEXCEL导出大概3分钟出结果 用php自带的fputcsv大约1分钟出结果,但是因为有身份证和其他超长数字字段, 又会变成科学计数法
用FPUTCSV的时候给每个字段加上\t 可以避免科学计数法 但是在csv文件中每个字段都隐藏了双引号 客户无法接受
用PHPEXCEL可以指定某字段为文本格式 但导出时间太久 客户也无法接受
目前程序循环本身已尽可能优化, 就是导出这里没有办法 希望在以下两个方向的任意一个得到帮助
1. 优化或者简化PHPEXCEL的使用,使其在能满足以上功能的情况下尽可能提高效率
2. 导出CSV可以使长数字不以科学计数法的形式显示,或者指定该列单元格格式为文本
有有效的思路亦可 不胜感激
------解决思路----------------------
把你的方法或代码贴出来看看,研究研究,口说有点不清晰
------解决思路----------------------1.Excel可以支持100万行记录,Excel 2003最大支持65536行,从2007版开始支持104万行,Excel极限是65536条。
参考下:循环生成CSV 数据, 每生成1000 条的时候刷新下缓冲期
<br />$fp = fopen('php://output', 'a');<br /><br />// 输出Excel列名信息<br />$head = array("电子邮件");<br />foreach ($head as $i => $v) {<br /> // CSV的Excel支持GBK编码,一定要转换,否则乱码<br /> $head[$i] = iconv('utf-8', 'gbk', $v);<br />}<br /><br />// 将数据通过fputcsv写到文件句柄<br />fputcsv($fp, $head);<br /><br />// 计数器<br />$cnt = 0;<br />// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小<br />$limit = 100000;<br /><br />// 逐行取出数据,不浪费内存<br />$count = count($email);<br /><br />for($t=0;$t<$count;$t++) {<br /><br /> $cnt ++;<br /> if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题<br /> ob_flush();<br /> flush();<br /> $cnt = 0;<br /> }<br /> $row[] = $email[$t];<br /> foreach ($row as $i => $v) {<br /> $row[$i] = iconv('utf-8', 'gbk', $v);<br /> }<br /> fputcsv($fp, $row);<br /> unset($row);<br />}<br /><br />2.长数字,可以再导出的时候,在前面预加个空格,这个就不以长度计数形式导出,而是以文本形式导出。<br />
登入後複製