PHP导出大量数据到csv表
对于做后台开发的码农来说,从excel导入数据到数据库亦或者是从数据库导出数据到excel都是很常见的操作。由于经常遇到这样的场景,也因为从数据库导出数据到表格所遇到的坑有很多,所以需要另辟途径来进行这种场景优化。
如果是小量的数据导出到excel的表格的话,一般不会有太多效率和资源占用的问题,但是当数据量变得庞大了,例如20万或者50万的时候就会造成PHP处理的瓶颈,要么内存溢出要么脚本运行超时。当然PHP是相对于比较灵活的,大可在方法运行的时候单独更改超时时间和脚本运行内存。但是这都是于事无补的,一般xls的格式最大支持六万行的数据左右,所以到了六万行的时候就凉凉了。
后续查阅资料发现csv是可以支持无限行数的,只要你的电脑能支持打开就能不断的往里面塞数据。
CSV格式文件最大行数是没有上限的,在国外科学数据网站下载的CSV文件有几十G上百G,行数多大几十亿上百亿行;但是大文件CSV打开编辑的软件就基本没有,Excel、wps、openoffice紧支持打开编辑前面1048576行;snapde软件支持的行数多一些,一次可以打开编辑一两千万行的CSV数据,速度超快。
代码
<?php
public function exportWarehouseManagementToExcel()
{
ini_set('max_execution_time', 300);// 设置PHP超时时间
ini_set('memory_limit', '2048M');// 设置PHP临时允许内存大小
$querySql = "SELECT * FROM fsyz_cpInventory WHERE 1=1";//导出所有的数据
$queryResult = $this->db->query($querySql)->result_array(); //路径
$fileName = '车管驻点业务寄递仓库管理所有数据' . date('Ymd_His') . '.csv';
$filePath = 'excel/' . $fileName;
$index = 0;
$fp = fopen($filePath, 'w'); //生成临时文件
chmod($filePath, 0777);//修改可执行权限
// 将数据通过fputcsv写到文件句柄
$header = array('车牌号码', '车牌类型', '所在区域', '状态', '入库时间');//设置表头
fputcsv($fp, $header);
//处理导出数据
foreach ($queryResult as $key => &$val) {
foreach ($val as $k => $v) {
$val[$k] = $v . "\t";
if ($index == 10000) { //每次写入1000条数据清除内存
$index = 0;
ob_flush();//清除内存
flush();
}
$index++;
}
fputcsv($fp, $val);
}
ob_flush();
fclose($fp); //关闭句柄
header("Cache-Control: max-age=0");
header("Content-type:application/vnd.ms-excel;charset=UTF-8");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . basename($fileName));
header("Content-Type: text/csv");
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($filePath));
@readfile($filePath);//输出文件;
unlink($filePath); //删除压缩包临时文件
echo $filePath;
return;
}
转载:
PHP导出大量数据到csv表的更多相关文章
- Hive导出复杂数据到csv文件
工作中经常遇到使用Hive导出数据到文本文件供数据分析时使用.Hive导出复杂数据到csv等文本文件时,有时会遇到以下几个问题: 导出的数据只有数据没有列名. 导出的数据比较复杂时,如字符串内包含一些 ...
- php导出百万数据到csv
<?php set_time_limit(0); // 设置超时 ini_set('memory_limit', '100M'); // 设置最大使用的内存 header("Conte ...
- angular6 导出json数据到excal表
1 首先使用npm下载插件依赖的安装包 npm install file-saver --save npm install xlsx --save 2 引入项目中的ts文件中 impo ...
- 导出大量数据到excel表
set_time_limit(0);error_reporting(0); // 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: applicat ...
- 导出数据库数据到Excel表
后台需要将用户信息数据导入到Excel表中提供给相关人员: 首先查询数据就不多说了: 导入Excel表直接亮代码(采用的是jxl的jar包提供的方法): public static File Impo ...
- 【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星
#!/bin/bash#@author:feiyuanxing [既然笨到家,就要努力到家]#@date:2017-12-05#@E-Mail:feiyuanxing@gmail.com#@TARGE ...
- Mysql 只导出数据,不包含表结构
mysqldump -u${user} -p${passwd} --no-create-info --database ${dbname} --table ${tablename} > ${ta ...
- C#导出数据到CSV和EXCEL文件时数字文本被转义的解决方法
今天写C#导出datagrid数据到csv格式文件的时候,发现不管怎么尝试,凡是单元格里面全是数字的单元格,在用Excel打开的时候,都被自动转义成数据格式.数据查看极其不方便.最后google了一下 ...
- oralce 超过1亿条数据的数据库表清理实践
2018-08-18 16:58 无腿鸟 阅读(331) 评论(0) 编辑 收藏 问题:当一个表的数据量超过一亿条,要删除其中的5000w条,如何处理. 如果直接使用delete语句,会涉及到到大量的 ...
随机推荐
- [CSP-S模拟测试]:序列(主席树)
题目描述 小$A$把自己之前得到的序列展示给了小$B$,不过这一次,他并不要求小$B$模仿他之前的行为.他给了小$B$一些询问,每个询问都是$l\ r\ x$的形式,要求小$B$数出在序列的第$l$个 ...
- Gym-100676F Palindrome
原题连接:https://odzkskevi.qnssl.com/1110bec98ca57b5ce6aec79b210d2849?v=1491063604 题意: 多组输入,每一次输入一个n(字符串 ...
- 全国5A级旅游景区已达250家
至目前,全国5A级旅游景区已达250家,快来数数你去过多少? 全国5A级旅游景区 西藏(+) 拉萨市大昭寺.拉萨布达拉宫景区.日喀则扎什伦布寺景区.林芝巴松措景区 新增1:日喀则扎什伦布寺景区 扎什伦 ...
- 【转】 Linux 的目录详解 (Linux基础一)
前言 转自: http://c.biancheng.net/view/2833.html 进行了一些提炼和修改. 学习 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各 ...
- 对GridFS数据进行分片
On this page files 集合 chunks 集合 在对 GridFS 存储进行分片时,需要注意以下的情况: files 集合 大多数情况下不需要对 files 集合进行分片,这个集合通常 ...
- javascript获取网页宽高,屏幕宽高,屏幕分辨率等
<script> var s = ""; s += "\r\n网页可见区域宽:"+ document.body.clientWidth; s + ...
- Java +selenium Navigation接口介绍
Navigation接口主要实现对浏览器的前进.后退.打开网址.刷新当前页面等操作的. void back():就是操作当前页面后退,相当于网页的后退按钮. void forward():就是操作当前 ...
- jmeter中如何使用csv文件并读取数据
我现在要测试一个新的网站,需要负载测试这个功能“加入购物车”.要做到 这一点,我需要模拟多个用户登录并进行购物操作,具体的场景为每一个人将同样的物品加入到购物车. JMeter 处理这些请求完全没有问 ...
- 爬取拉勾网python工程师的岗位信息并生成csv文件
转载自:https://www.cnblogs.com/sui776265233/p/11146969.html 代码写得很好,但是目前只看得懂前一部分 一.爬取和分析相关依赖包 Python版本: ...
- mysql 【常用sql】
修改过mysql数据库字段内容默认值为当前时间 --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE `table_name` ADD COLUMN ...