美文网首页
PHP 导出EXCEL

PHP 导出EXCEL

作者: 封不然 | 来源:发表于2018-11-11 01:32 被阅读32次

    在后端开发中,做产品后台时总会涉及到数据导出,导出excel,相信大家都做过吧。接下来推荐集中导出的写法,供个参考。

    1.使用第三方类库进行实现

    说起用第三方的话,phpExcel一定很不陌生,使用composer可以直接整下来了

    # 原来的,该软件包已**被放弃**,不再维护。作者的建议是用下面那个新的
    composer require phpoffice/phpexcel
    # 新的
    composer require phpoffice/phpspreadsheet
    

    ,不行可以直接github下载

    # 原来的,该软件包已**被放弃**,不再维护。作者的建议是用下面那个新的
    https://github.com/PHPOffice/PHPExcel
    # 新的
    https://github.com/PHPOffice/PhpSpreadsheet
    

    使用方式也是很简单的,具体的看文档吧,不过这个的话相对于内存使用较高一些,不过个人绝对,如果只是针对于简单的数据导出,直接写csv就好了,所以不是很推崇这个

    https://phpoffice.github.io/PhpSpreadsheet/master/
    

    2.使用CSV直接输出的形式

    如果采用同步的操作的时候,可以直接以header的形式输出
    实现方式如下

    // 换行符
    $csv_terminated = pma_whichCrlf();
    $data = [];// 需要输出的内容
    $data = array_map(function($item){
      // TODO: 对于数据做一些处理
    }, $data);
    // 拼接str
    // $strs = join(',', $row).$csv_terminated;
    header("Content-type:text/csv");
    header("Content-Disposition:attachment;filename=文件名.csv");
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Expires:0');
    header('Pragma:public');
    echo $strs;
    

    接下来,咱们进一步的优化这个程序,首要想到的优化,肯定是将同步的转化为异步的。也就是导出实际上就是发起一个命令,生成一个文件,然后进行文件写入。

    // TODO: 任务参数,根据任务出数据
    $fp = fopen('文件路径加文件名.csv', 'w');
    $data = [];// 需要输出的内容
    $data = array_map(function($item){
      // TODO: 对于数据做一些处理
    }, $data);
    // 将数据写入文件,当然可以在array_map中就完成这个动作
    // fputcsv($fp, $row);
    fclose($fp);
    // TODO: 处理任务状态
    

    emmm,这种程度一般是够用了,但是嘛,本着极客思维,这种还是不能让咱们就此满足,毕竟嘛,实话实说,PHP文件操作还是很差,如果我中间循环用了file_put_contents(),那简直慢死,上面的虽然只有一个资源句柄,但是能不用还是不用了。那怎么做呢?借助个shell脚本 php artisan 命令 >> 文件.csv / php think 命令 >> 文件.csv

    // TODO: 任务参数,根据任务出数据
    $csv_terminated = pma_whichCrlf();
    $fp = fopen('文件路径加文件名.csv', 'w');
    $data = [];// 需要输出的内容
    $data = array_map(function($item){
      // TODO: 对于数据做一些处理
    }, $data);
    // 将内容循环输出,当然可以在array_map中就完成这个动作
    // echo  join(',', $row).$csv_terminated;
    fclose($fp);
    // TODO: 处理任务状态
    

    3.写CSV要注意哪些东西

    写csv要注意,挺多东西的,例如换行,有例如科学技术法,又例如有人不会用utf8格式打开CSV等。

    1. 换行问题
    说起来也简单,如果就是转译掉 里面的 ",和去掉换行符

    // 在array_map 中写就好,注意要把那个$csv_terminated use进去
    foreach($item as $field => $value) {
      $item[$field] = addslashes($value);
      $item[$field] = str_replace($csv_terminated, '', $value);
    }
    return $item;
    

    2.科学计数法
    很多比较长的数字串会被转成科学计数法,网上很多人说的解决方案是插入一个字母或者制表符,我觉得这个方法还是不太可取的,可以采用“写个excel公式”式的方式,解决这个问题,具体方法是

    foreach($item as $field => $value) {
      $item[$field] = '="' . $value . '"';
    }
    return $item;
    

    3.至于遇到不会用utf8查看文件的
    这个就喊他去谷歌吧,没有梯子就去百度吧,搜出来一般有两者方式
    1.新建一个excel,然后进入数据,倒入数据,来自文本,将你的csv当作数据源倒入进去
    2.第二张是在文本中有选项查看的格式

    如果有遇到什么其他的问题,或者更好的方式,也欢迎留言共同探讨

    相关文章

      网友评论

          本文标题:PHP 导出EXCEL

          本文链接:https://www.haomeiwen.com/subject/tmkuxqtx.html