fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题

slqgenius 2021-09-07 原文

 

    在PHP的日常开发中,时常会需要导出 excel ,一般我们会使用 PHPExcel ,性能强大,但是在数据量大的时候,phpexcel 性能差、内存溢出等各种不可控问题就会出现。因此,如果对导出样式要求不高,我们可以使用 php 原生的 fputcsv 导出表格,最近项目中,有同事就遇到这个问题,推荐他使用 fputcsv,本着分享的精神,在此记录,希望能够帮助一些新入行的童鞋。

直接上代码:

<?php 
ob_end_clean();

// 文件名
$filename = $type.\'_order_\'.date(\'YmdHis\').\'.csv\';
$title = [\'单号\', \'状态\', \'数量\', \'商品名\', \'发货人\', \'收货人\'];

// 设置 header 头
header(\'Content-Type: application/vnd.ms-excel\'); // 文件格式
header(\'Content-Type: charset=utf-8\'); // 文件编码
header(\'Content-Disposition: attachment; filenaeme=\'. $filename); // 文件名
header(\'Content-Type: application/octet-stream\'); // 二进制流
// header("Accept-Ranges:bytes");// 表明范围单位为字节,可不写
header("Pragma: no-cache"); // 禁止缓存
header("Expires: 0");// 有效期时间

$fp = fopen(\'php://output\',\'w+\');

fputcsv($fp, transCode($title));

// 处理数据 [伪代码]
// 如果从数据库获取数据并处理,可以分批进行查询,也可以使用多个文件进行导出
// $result

$count = 0; //计数器
$limit = 10000; 

while ($row = $result->fetchRow()) {
    $count++;
    if ($count == $limit) {
        ob_flush(); // 刷新 php 缓存
        flush(); // 刷新输出缓存
        $count = 0; // 重置计数器
    }

    // 逐行写入
    fputcsv($fp, transCode($row));
    unset($row);
}

fclose($fp);
// 编码转换
// 代码一般是 utf-8 格式, csv 导出默认也是 utf-8 格式,而 excel 直接打开默认不识别 utf-8 格式,因此,要导出数据都要进行 格式转换
// 每个字段后加上 "\t" 可以防止长数字显示为科学计数法 
function transCode(array &$arr){
    foreach ($arr as &$v) {
        $v = "\t".iconv(\'utf-8\', \'gb2312//ignore\', $v);
    }
}

可能出现问题:
乱码问题:转换编码为 gb2312 或 gbk
特殊字符问题:字段后 加 “\t” 或 双引号
数据丢失问题:gb2312 可识别的字符比较少,可以换成 gbk
csv 时间格式筛选: 文本格式的时间无法进行分组筛选,可在 转码的时候进行过滤,如果是时间格式,不转成 文本格式,即 不加 “\t”

文章来源:https://blog.51cto.com/12750968/2133076

版权声明:本文为slqgenius原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/slqgenius/p/11719679.html

fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题的更多相关文章

  1. Jmeter深度学习第一天——简单请求、带header请求、返回值乱码问题

        Jmeter是一个比较通用的接口测试和压测工具,而且还可以根据需要做二次开发,后续公司可能有压测的需求 […]...

  2. 遗留问题,排雷会炸,不排也会炸!

    本周一个故障,记录一下。 诸位知道,历史遗留代码,只要能运行,一般都不愿意去动的。 然而, 遗留问题就像雷区, […]...

  3. 应用服务器GC回收常见问题总结

    应用服务器GC回收常见问题总结 Posted on 2018-01-18 20:06 召冠 阅读(… […]...

  4. AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

    AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控 […]...

  5. MongoDB聚合框架中的多表关联查询($lookup)

    一.  聚合框架  聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的 […]...

  6. JS数组专题2️⃣ ➖ 数组去重

    距离上次发文,已经有一段时间了,最近工作比较忙,这不眼看快双十一了,就相当于给大家一些福利吧! 一、什么是数组 […]...

  7. linux zip/unzip err encoding压缩解压中文文件 乱码

    在linux下压缩和解压(zip,unzip)时,如果文件名中含有中文,就会由于文件名编码(encoding) […]...

  8. phpcms的一些问题 乱码,安装

    一、乱码:我这的网站出现的乱码情况:后台栏目名乱码,迁站后更新缓存,再更新栏目,内容,前台都乱码. 找了半天原 […]...

随机推荐

  1. CentOS7 手动部署flannel并启用vxlan

    本以为docker准备妥当之后,就可以直接上k8s了,结果yum install kubernetes,报错: […]...

  2. 【Azure 事件中心】EPH (EventProcessorHost) 消费端观察到多次Shutdown,LeaseLost的error信息,这是什么情况呢?

    问题详情 使用EPH获取Event Hub数据时,多次出现连接shutdown和LeaseLost的error […]...

  3. Java 位运算符 &、|、^、~、<>、>>>

          撸了N久的代码,但是突然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪?   1 […]...

  4. Python读取配置文件,并连接数据库SQL Server

    用配置文件保存固定的连接数据,改的话比较方便。 1.新建一个配置文件:SQlconfig.config,以数据 […]...

  5. [Linux]Ubuntu安装Java详细教程

    环境:Ubuntu16.04 桌面版虚拟机 1、下载安装包:jdk-8u231-linux-x64.tar.g […]...

  6. 自定义SpringBoot启动banner

    序: springboot启动的时候会有一个启动logo似的东西,如图,这个logo似的东西叫做banner, […]...

  7. celery异步消息队列的使用

    1、准备工作 1.1 流程图      2、环境安装   2.1、在Ubuntu中需要安装redis 安装re […]...

  8. [UE4]虚幻4蓝图使用小技巧

    不得不说,虚幻的蓝图系统还是非常方便强大的,大大的提高了开发效率。蓝图是一个很成熟的系统,也就有很多隐藏的小技 […]...

展开目录

目录导航