老话题了...求助PHP导出EXCEL,phpexcel类很强大,但是效率低速度慢,fputcsv速度快但不知道怎么解决科学计数法的问题,求老司机传授经验 本帖最后由 anyilaoliu 于 2014-08-20 16:39:12 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 优化的一种方法:http://bbs.youyax.com/Content-5058假设有10000条数据,分10次导出,每次导出1000条,这种方法的好处是,可以避免长时间等待,但是有个问题是好像还是很占用内存,文件太大依然会报内存不足原理是:先导出1000条,再次读取,定位到第1001行,继续导出下1000条,再次读取,定位到2001,…… 1.Excel可以支持100万行记录,Excel 2003最大支持65536行,从2007版开始支持104万行,Excel极限是65536条。参考下:循环生成CSV 数据, 每生成1000 条的时候刷新下缓冲期$fp = fopen('php://output', 'a');// 输出Excel列名信息$head = array("电子邮件");foreach ($head as $i => $v) { // CSV的Excel支持GBK编码,一定要转换,否则乱码 $head[$i] = iconv('utf-8', 'gbk', $v);}// 将数据通过fputcsv写到文件句柄fputcsv($fp, $head);// 计数器$cnt = 0;// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小$limit = 100000;// 逐行取出数据,不浪费内存$count = count($email);for($t=0;$t<$count;$t++) { $cnt ++; if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题 ob_flush(); flush(); $cnt = 0; } $row[] = $email[$t]; foreach ($row as $i => $v) { $row[$i] = iconv('utf-8', 'gbk', $v); } fputcsv($fp, $row); unset($row);}2.长数字,可以再导出的时候,在前面预加个空格,这个就不以长度计数形式导出,而是以文本形式导出。 目前尚无很好的办法, PHPexcel总是很慢 未能成功优化 。。我碰到过和你类似的问题,可以很明确的告诉你phpexcel的效率比较低,即使代码做了最好的优化。循环向单元格填数据还好,如果涉及到循环设置样式,那效率就底的吓人了。后来我使用了另一种结合java的方式 ,可以将效率提高10倍以上。如果想深入了解可以+我qq 78938076 这个是我生成的excel文件,列行均较多,比phpexcle生成的效率能提高n倍。78938076 联系。 fputcsv 如何强制所有的数据都加双引号 求一正则表达式 #hashtag session的怪问题,牛X人进 急 急 急 困惑呀 不知道用那种语言好 一条PHP语句的问题 谁帮我看看下面的代码是什么意思? php对MYSQL数据库进行查询,为什么只能查找到英文关键字的记录?而中文的就不行。 刚学php,请教 一个PHP程序运行的进度条的问题咨询 PHPWord怎么对已有的表格进行赋值 header影响数据库添加? 提取一段字符串中的URL
http://bbs.youyax.com/Content-5058
假设有10000条数据,
分10次导出,每次导出1000条,
这种方法的好处是,可以避免长时间等待,
但是有个问题是好像还是很占用内存,
文件太大依然会报内存不足
原理是:
先导出1000条,
再次读取,定位到第1001行,
继续导出下1000条,
再次读取,定位到2001,
……
$head = array("电子邮件");
foreach ($head as $i => $v) {
// CSV的Excel支持GBK编码,一定要转换,否则乱码
$head[$i] = iconv('utf-8', 'gbk', $v);
}// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;// 逐行取出数据,不浪费内存
$count = count($email);for($t=0;$t<$count;$t++) { $cnt ++;
if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
ob_flush();
flush();
$cnt = 0;
}
$row[] = $email[$t];
foreach ($row as $i => $v) {
$row[$i] = iconv('utf-8', 'gbk', $v);
}
fputcsv($fp, $row);
unset($row);
}2.长数字,可以再导出的时候,在前面预加个空格,这个就不以长度计数形式导出,而是以文本形式导出。