fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
在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
fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题的更多相关文章
- Gridview数据导出excel时身份证号码为科学计数法的解决方法
if (e.Row.RowType == DataControlRowType.DataRow) { string id = this.GridView1.DataKeys[e.Row.RowInde ...
- 导出CSV,导出excel数字过长显示科学计数法解决方案
再导出CSV表格时发现数字超过一定长度后会缩写成科学计数法,对于手机号和身份证就比较尴尬了. 在网上找了一下,大部分都是加"'"将数字转换为字符串,但是纠结于导出的数字前面有个单引 ...
- jsp 页面导出excel时字符串数字变成科学计数法的解决方法
web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html 当我们把web页面上的数据 ...
- mysql导出csv文件excel打开后数字用科学计数法显示且低位变0的解决方法
Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0. Excel打开csv文件时,只要字段值都是数字,它 ...
- Laravel 使用 maatwebsite/excel 时长数字出现科学计数法的解决办法
在使用 maatwebsite/excel 包导出Excel的时候,有的单元格里会存放手机号等一大串的数字,这一串数字会被Excel软件处理为科学计数法,在后续处理数据的时候会产生不小的麻烦,一个个去 ...
- 导出csv用excel打开后数字不用科学计数法显示(0123456显示123456)
从这儿抄过来的: http://zhejiangyinghui.iteye.com/blog/1149526 最近写了一个生成csv的程序,生成的csv其中有一列数字长度为13位,csv中查看没有问题 ...
- csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法
保存在csv中的 013812345678,前面的0会被去掉,后面是科学计数法显示.保存成 col1,="013812345678" 即可. 注意,分隔符逗号后面直接接“=”等号. ...
- 怎样批量把excel中已显示的科学计数法取消
作者:iamlaosong 把一文本文档拷贝到EXCEL中时,当中一列数字所有变成科学计数法,这些数事实上是条码号,不需进行运算,怎样能够取消科学计算法,将数字显示成原来的样子呢?一般方法例如以下: ...
- 在把table表格中的数据导出到Excel的时候,以科学计数法显示位数多的数字时怎么解决?
sbHtml.AppendFormat("<td> {0}</td>", data[i].IDcard.ToString()); sbHtml.Append ...
- Oracle导出csv时数字不变成科学计数法
导出成CSV后,用excel打开,点击excel的[数据]→[自文本],选择导出的csv文件,下一步,分隔符选择[逗号],下一步,选择所有列“按住shift+鼠标左键选取”后,列数据格式选文本,[完成 ...
随机推荐
- 2018-2019-2 20165212《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165212<网络对抗技术>Exp9 Web安全基础 基础问题回答 1.SQL注入攻击原理,如何防御? 原理:SQL注入,就是通过把SQL命令插入到Web表单递 ...
- vue element-UI Form表单验证
摘自官网 https://element.eleme.cn/#/zh-CN/component/form 保证prop的值等于v-model的值,并且初始化值,这样验证才好使. 可以自定义验证 < ...
- CentOs7设置主机名称,以及主机名称和ip的对应关系
一.修改主机名称 在CentOS7中有三种定义的主机名:静态的(static).瞬态的(transient).和灵活的(pretty).静态主机名也称为内核主机名,是系统在启动时从/etc/hostn ...
- JVM 数组创建的本质
1.创建数组 创建一个MyParent4[] 数组 public class MyTest4 { public static void main(String[] args) { MyParent4[ ...
- ActiveMQ参数异常 “Invalid broker URI”
某次启动项目报错,提示ActiveMQ参数异常 该参数的值配置如下 跟踪读取配置的代码如下,可以看到读取我配置的key为xmq.actmq.connection.url.forSend的对应值,赋值到 ...
- 【Java/Json】Java对Json进行建模,分词,递归向下解析构建Json对象树
伸手党的福音 代码下载:https://files.cnblogs.com/files/xiandedanteng/JsonLexerBuilder20191202.rar 互联网上成型的对Json进 ...
- 【maven】在pom.xml中引入对json-lib的依赖dependency
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</art ...
- 移动端IM系统的协议选型:UDP还是TCP?(转)
源: 移动端IM系统的协议选型:UDP还是TCP?
- composer Changed current directory to没反应
根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C:/User ...
- .NET Core入门程序
易百教程 https://www.yiibai.com/dotnet_core/dotnet_core_getting_started.html