...
老话题了...求助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 条的时候刷新下缓冲期
$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
$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.长数字,可以再导出的时候,在前面预加个空格,这个就不以长度计数形式导出,而是以文本形式导出。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论