之前写过一篇php生成excel的文章 thinkphp整合系列之phpexcel生成生成excel文件
但是phpexcel有一个严重的缺点;那就是一个大大的“慢”字;
数据量小的时候还好;当数据量稍微大一点;
那生成excel的过程99.999%的时间都是在那看浏览器转圈了;
那有木有一个效率高点的呢?当然有了;而且非常简单;
贴代码;
/**
* 数据转csv格式的excle
* @param array $data 需要转的数组
* @param string $filename 生成的excel文件名
* 示例数组:
$a = array(
'1,2,3,4,5',
'6,7,8,9,0',
'1,3,5,6,7'
);
*/
function create_csv($data,$filename='simple.csv'){
// 防止没有添加文件后缀
$filename=str_replace('.csv', '', $filename).'.csv';
Header( "Content-type: application/octet-stream ");
Header( "Accept-Ranges: bytes ");
Header( "Content-Disposition: attachment; filename=".$filename);
foreach( $data as $k => $v){
// 替换掉换行
$v=preg_replace('/\s*/', '', $v);
// 转成gbk以兼容office乱码的问题
echo iconv('UTF-8','GBK',$v)."\r\n";
}
}
调用示例:
$data=array(
'1,2,3,4,5',
'6,7,8,9,0',
'1,3,5,6,7'
);
create_csv($data);
其实原理很简单;就是以逗号作为每个单元格的分解;再以换行作为表格的换行;
最后生成csv格式的文件就可以了;
下载到本地后;直接以当text用记事本或者文本编辑器都可以直接打开编辑;
// 回复储的分割线*
实际应用中数据一般是从数据库取出的二维数组;
应储的问题;更新下函数;以兼容二维数组;
同时可以直接指定表头;
/**
* 数据转csv格式的excle
* @param array $data 需要转的数组
* @param string $header 要生成的excel表头
* @param string $filename 生成的excel文件名
* 示例数组:
$data = array(
'1,2,3,4,5',
'6,7,8,9,0',
'1,3,5,6,7'
);
$header='用户名,密码,头像,性别,手机号';
*/
function create_csv($data,$header=null,$filename='simple.csv'){
// 如果手动设置表头;则放在第一行
if (!is_null($header)) {
array_unshift($data, $header);
}
// 防止没有添加文件后缀
$filename=str_replace('.csv', '', $filename).'.csv';
Header( "Content-type: application/octet-stream ");
Header( "Accept-Ranges: bytes ");
Header( "Content-Disposition: attachment; filename=".$filename);
foreach( $data as $k => $v){
// 如果是二维数组;转成一维
if (is_array($v)) {
$v=implode(',', $v);
}
// 替换掉换行
$v=preg_replace('/\s*/', '', $v);
// 转成gbk以兼容office乱码的问题
echo iconv('UTF-8','GBK',$v)."\r\n";
}
}
//*****************************回复 一生有你、水木年华
的问题的分割线 *******************************
导出csv格式没法设置数据的格式;
这里给出一个方案;
可以在每个单元格后面追加一个看不见的tab制表符;
这样就不是数字格式;
也就不会被显示成科学计数法了;
/**
* 数据转csv格式的excle
* @param array $data 需要转的数组
* @param string $header 要生成的excel表头
* @param string $filename 生成的excel文件名
* 示例数组:
$data = array(
'1,2,3,4,5',
'6,7,8,9,0',
'1,3,5,6,7'
);
$header='用户名,密码,头像,性别,手机号';
*/
function create_csv($data,$header=null,$filename='simple.csv'){
// 如果手动设置表头;则放在第一行
if (!is_null($header)) {
array_unshift($data, $header);
}
// 防止没有添加文件后缀
$filename=str_replace('.csv', '', $filename).'.csv';
ob_clean();
Header( "Content-type: application/octet-stream ");
Header( "Accept-Ranges: bytes ");
Header( "Content-Disposition: attachment; filename=".$filename);
foreach( $data as $k => $v){
// 如果是二维数组;转成一维
if (is_array($v)) {
$v=implode(',', $v);
}
// 替换掉换行
$v=preg_replace('/\s*/', '', $v);
// 解决导出的数字会显示成科学计数法的问题
$v=str_replace(',', "\t,", $v);
// 转成gbk以兼容office乱码的问题
echo iconv('UTF-8','GBK',$v)."\t\r\n";
}
}
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
weaponlandrover :真好呀
2019-06-14 11:35:21 回复
纵横之鬼谷子 :array数组里含有中文就不行了,为什么?怎么才能解决?白哥求指教
2017-12-14 15:33:17 回复
云淡风晴 :我现在使用这个 https://github.com/Maatwebsite/Laravel-Excel 避免表头中文;
2017-12-24 18:41:13 回复
kitty :如何原数据中存在逗号,会不会乱,有时间我测试一下就知道了。
2017-10-27 16:37:39 回复
开卷有益 :
2017-12-12 14:19:13 回复
Jack :大神联系方式可以说下吗?731547576 qq
2017-09-26 11:27:00 回复
残岩飞雪 :加的表头为什么没有用,记事本可以显示出来,Excel打开就报格式错误
2017-09-04 11:44:34 回复
残岩飞雪 :这种方式好像压根就没用到 PHPExcel 第二就是,只要设置表头,在记事本可以显示可以,用excel打不开,一直提示“格式与文件拓展名指定格式不一致 ”如何解决啊,白哥
2017-09-03 21:08:41 回复
大灰狼 :从数据库查出来的数据,转换后都排成一行了。不知道为什么
2017-07-16 17:38:08 回复
云淡风晴 :我现在比较推荐这个项目 https://github.com/PHPOffice/PHPExcel
2017-07-16 22:57:48 回复
大灰狼 :。。。不都是PHPExcel吗
2017-07-16 22:59:08 回复
云淡风晴 :之前用起来是真慢;现在好多了;
2017-07-16 23:01:05 回复
小狮子 :$v=str_replace(',', "\\t,", $v);” 无法给最后的单元格追加制表符。这里给出我的解决方案: $v = array_map(functi, $value); }, explode(',', $v));
2017-05-12 16:08:36 回复
Serene :数据中的空格都被删除了,这个怎么解决呢?例如2017-03-14 16:11:59,excel里面是2017-03-1416:11:59
2017-03-14 16:12:46 回复
Serene :已解决;建议将替换掉换行的正则改为 $v=preg_replace('/\n*/','',$v);这样就避免了将数据中的空格也替换掉了;
2017-03-14 16:24:25 回复
Day Day Xiang Up :不错哦!
2017-03-09 21:19:09 回复
香蕉你个banana :白大神问题解决了
2017-03-09 18:47:39 回复
lctx186 :同遇到这种情况 , 请教下解决方法
2018-10-09 20:44:11 回复
香蕉你个banana :白大神,在今天使用导出csv的格式的时候,会有数据丢失的情况,但是,在打印数据的时候能打印出来,数据都能看到,就是数据表格导出完成后,回会存在每隔一几条数据丢失一条数据,不知道怎么解决.
2017-03-09 18:30:22 回复
°~~ :啊哈哈
2017-02-17 16:03:14 回复
°~~ :
2017-02-17 16:02:37 回复
☆别欺负涛哥☆ :白大哥 你用的phpexcel都是简单的$data转Excel 或者 Excel转$data 能不能把导入的Excel表格 转成柱状图或者 曲线图 之类的在 页面显示 啊
2017-02-10 10:12:29 回复
酒鬼 :上传csv文件里面有多个工作表 怎么全部读取?
2017-01-23 13:35:37 回复
天祥科技 :我在thinkphp中写的 为什么连html代码都输出来了
2016-11-09 10:05:37 回复
云淡风晴 :不要有其他任何echo之类的输出;
2016-11-10 22:59:53 回复
✔Ice_曲 :请问为什么直接输出了 没有生成文件 下载到本地呢?
2016-09-20 17:34:31 回复
云淡风晴 :Header被注释了么?
2016-09-20 21:58:50 回复
一生有你、水木年华 :想问问如何设置csv中的表格中的数据默认为文本格式
2016-09-19 02:05:13 回复
云淡风晴 :补充到文章后边了;
2016-09-19 22:36:30 回复
云淡风晴 :补充到文章后边了;
2016-09-19 22:36:30 回复
°~~ :大爱博主
2017-02-17 16:08:22 回复
南城阿牛 :白大哥,我导出了记事本打开正常,而excel会出现乱码,用户的银行卡号
2016-08-22 22:33:14 回复
云淡风晴 :是显示的###么?
2016-08-22 22:41:32 回复
南城阿牛 :显示:6.2262E+15
2016-08-22 22:47:17 回复
南城阿牛 :显示:6.2262E+15
2016-08-22 22:47:38 回复
南城阿牛 :记事本打开正常为:6226622001135041
2016-08-22 22:48:12 回复
云淡风晴 :那不是乱码;是科学计数法;你按这个来 http://jingyan.baidu.com/article/fdffd1f8e57f05f3e98ca1e0.html
2016-08-22 23:10:10 回复
南城阿牛 :似乎明白了,可是这篇文章的解决办法是在excel编辑状态下的,我导出csv后,然后设置单元格为文本,发现还是没有变化
2016-08-22 23:30:23 回复
南城阿牛 :问题解决了,excel设置问题,谢谢大哥
2016-08-22 23:45:19 回复
大海 :牛哥,我从数据集获取的数据打印 数组该怎么写,最会打印最后一行
2017-05-16 10:59:27 回复
储 :二维数组如何处理?
2016-08-13 15:59:01 回复
储 :比如,我的数组是 $data=array( array(1,2,3), array(4,5,6) );需要达成1,2,3一行, 4,5,6一行 怎么实现。我用双foreach套上去出来的是 一个数字一行
2016-08-13 16:02:54 回复
储 :函数中加了遍历二维数组,用 implode 处理后,解决了问题
2016-08-13 17:53:19 回复
云淡风晴 :恩恩;更新了下;放在了文章的最后;
2016-08-14 01:02:01 回复
4 :666
2016-08-12 20:15:15 回复
一梦初醒 :做的不错
2016-08-12 17:36:00 回复
NULL :s
2016-08-12 13:17:23 回复
NULL :是
2016-08-12 13:17:15 回复
NULL :学习了
2016-08-12 13:17:09 回复
中二癌晚期 :学习了 谢谢 一直关注大神
2016-08-11 09:25:58 回复
云淡风晴 :谢谢;
2016-08-13 23:37:23 回复
最新评论