在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,解决内存、性能、乱码、科学计数法问题的更多相关文章

  1. Gridview数据导出excel时身份证号码为科学计数法的解决方法

    if (e.Row.RowType == DataControlRowType.DataRow) { string id = this.GridView1.DataKeys[e.Row.RowInde ...

  2. 导出CSV,导出excel数字过长显示科学计数法解决方案

    再导出CSV表格时发现数字超过一定长度后会缩写成科学计数法,对于手机号和身份证就比较尴尬了. 在网上找了一下,大部分都是加"'"将数字转换为字符串,但是纠结于导出的数字前面有个单引 ...

  3. jsp 页面导出excel时字符串数字变成科学计数法的解决方法

    web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html   当我们把web页面上的数据 ...

  4. mysql导出csv文件excel打开后数字用科学计数法显示且低位变0的解决方法

    Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0. Excel打开csv文件时,只要字段值都是数字,它 ...

  5. Laravel 使用 maatwebsite/excel 时长数字出现科学计数法的解决办法

    在使用 maatwebsite/excel 包导出Excel的时候,有的单元格里会存放手机号等一大串的数字,这一串数字会被Excel软件处理为科学计数法,在后续处理数据的时候会产生不小的麻烦,一个个去 ...

  6. 导出csv用excel打开后数字不用科学计数法显示(0123456显示123456)

    从这儿抄过来的: http://zhejiangyinghui.iteye.com/blog/1149526 最近写了一个生成csv的程序,生成的csv其中有一列数字长度为13位,csv中查看没有问题 ...

  7. csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法

    保存在csv中的 013812345678,前面的0会被去掉,后面是科学计数法显示.保存成 col1,="013812345678" 即可. 注意,分隔符逗号后面直接接“=”等号. ...

  8. 怎样批量把excel中已显示的科学计数法取消

    作者:iamlaosong 把一文本文档拷贝到EXCEL中时,当中一列数字所有变成科学计数法,这些数事实上是条码号,不需进行运算,怎样能够取消科学计算法,将数字显示成原来的样子呢?一般方法例如以下: ...

  9. 在把table表格中的数据导出到Excel的时候,以科学计数法显示位数多的数字时怎么解决?

    sbHtml.AppendFormat("<td> {0}</td>", data[i].IDcard.ToString()); sbHtml.Append ...

  10. Oracle导出csv时数字不变成科学计数法

    导出成CSV后,用excel打开,点击excel的[数据]→[自文本],选择导出的csv文件,下一步,分隔符选择[逗号],下一步,选择所有列“按住shift+鼠标左键选取”后,列数据格式选文本,[完成 ...

随机推荐

  1. ICEM-气化炉

    原视频下载地址:https://yunpan.cn/cuPJWRHUJKXIL  访问密码 d379

  2. Spring boot 去除URL 里的 JSESSIONID

    方法一 application.yml 里设置 server: port: 80 servlet: session: tracking-modes: cookie cookie: http-only: ...

  3. 【转载】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

    原文链接:https://www.cnblogs.com/lixinjie/p/10811219.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使 ...

  4. Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计

    http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...

  5. 表单在ios下输入框必须重压或长按才能唤起软键盘

    解决方案: 一.在node_module里找到fastClick文件,然后找到focus方法,加一句focus方法即可解决:FastClick.prototype.focus = function(t ...

  6. flutter Form表单

    import 'package:flutter/material.dart'; class FormDemo extends StatelessWidget { @override Widget bu ...

  7. Vuex 的使用 State Mutation Getter Action

    import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); /*1.state在vuex中用于存储数据*/ var state={ cou ...

  8. 001——Typescript 介绍 、Typescript 安 装、Typescript 开发工具

    一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 4. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ...

  9. centos的6.9版本安装mysql

    用yum安装后,执行service命令启动: [root@centos ~]# yum install mysql-server Loaded plugins: fastestmirror, secu ...

  10. window TOMCAT 端口被占用了怎么办?

    查看80端口被哪些程序占用了 netstat -ano|findstr "80" 根据pid(进程id) 查询对应的应用程序 tasklist|findstr "1828 ...