php生成csv格式的excel表格

之前写过一篇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";
    }
}

白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共19条评论
白俊遥博客

Serene:数据中的空格都被删除了,这个怎么解决呢?例如2017-03-14 16:11:59,excel里面是2017-03-1416:11:59

2017-03-14 16:12:46 回复

白俊遥博客
  • Serene 回复 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 回复

白俊遥博客

香蕉你个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 回复

白俊遥博客
  • 云淡风晴 回复 ✔Ice_曲: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 回复
白俊遥博客

:二维数组如何处理?

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 回复

白俊遥博客

G-C-X:s

2016-08-12 13:17:23 回复

白俊遥博客

G-C-X:是

2016-08-12 13:17:15 回复

白俊遥博客

G-C-X:学习了

2016-08-12 13:17:09 回复

白俊遥博客

中二癌晚期:学习了 谢谢 一直关注大神

2016-08-11 09:25:58 回复

白俊遥博客
  • 云淡风晴 回复 中二癌晚期:谢谢;
  • 2016-08-13 23:37:23 回复
  • 本站使用自主开发的laravel-bjyblog开源博客程序搭建 © 2014-2016 baijunyao.com 版权所有 ICP证:豫ICP备14009546号-3
  • 联系邮箱:baijunyao@baijunyao.com