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语句,会涉及到到大量的 ...
随机推荐
- 绕X 轴 Y轴 Z轴旋转的结果
void warp_perspect_3_angle(cv::Mat face, float roll, float yaw, float pitch) { cv::Mat face_img = fa ...
- jmeter添加自定义扩展函数之if判断
1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...
- 测开之路二十:比较v1和v2
根据V1和V2的版本号,如果v1>v2,返回1,如果v1<v2,返回-1,除此之外返回0 # 如果v1>v2,返回1,如果v1<v2,返回-1,除此之外返回0v1 = inpu ...
- xcodebuild 自动化打包
altool 文档 使用xcode自带的xcodebuild 命令通过脚本进行打包 打包->导出ipa, 两行关键的脚本代码 1.Archive xcodebuild archive -arch ...
- Centos7 安装配置Apache+Mysql5.7+PHP7.0+phpmyadmin
Centos7 下安装配置Apache+Mysql5.7+PHP7.0+phpmyadmin 搭建LAMP =========================================Apach ...
- 比较CGI,FastCGI,PHP-CGI与PHP-FPM的区别
最早的Web服务器,可以简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. 随着时间的变化,网站也越来越复杂,所以出现动态技术.但是服务器并不能直接 ...
- Volatile 只保证可见性,并不保证原子性
[尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/52525724 在说明Java多线程内存可见性之前,先来简单了解一下J ...
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- Dubbox本地 JAR包部署与安装
Dubbox的jar包并没有部署到Maven的中央仓库中,大家在Maven的中央仓库中可以查找到Dubbo的最终版本是2.5.3 , 阿里巴巴解散了Dubbo团队后由当当网继续维护此项目,并改名为 D ...
- Solr添加索引
发送请求: http://localhost:8080/solr/update/?stream.body= <delete><id>id值</id></del ...