php不使用Office包实现上万条数据导出表格
经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白。
要是使用office包目前后台内存耗尽,被迫停止运行,所以想要突破百万条数据导出需要另辟它路。所以就是使用了导出CSV并非excel文件。
1、设置程序需要一直运行并设置运行内存(php提示过128M)by user 悦悦 https://www.cnblogs.com/nuanai
2、数据查询出需要导出的数据字段(分页)
3、分页进行导出文件并一起合并成压缩包后下载
如果导出前需要某些条件筛选,那就需要在前端设置表单提交筛选条件(不过多介绍)
导出配置的编写,需要设置文件路径、名称、表头等基本信息 by user 悦悦 https://www.cnblogs.com/nuanai
1 //让程序一直运行
2 set_time_limit(0);
3 //设置程序运行内存---php提示过128M
4 ini_set('memory_limit', '128M');
5 //文件名使用的日期命名
6 $fileName = date('YmdHis', time());
7 //文件保存位置
8 $destPath = ROOT_PATH . 'public' .DS. 'uploads'.DS.'download'.DS.$fileName. '.csv';
9 // 打开文件句柄,准备写入数据
10 $fileHandle = fopen($destPath, 'w');
11 // 检查文件句柄是否成功打开
12 if ($fileHandle === false) {
13 die('无法打开文件: ' . $fileHandle);
14 }
15 //表头
16 fputcsv($fileHandle,['序号', '产品名称', '产品型号','工名称','条码1','条码2','状态','时间']);
17 //条数
18 $nums = 10000;
19 //数据表的总数
20 $count = $this->model->count();
21 $step = ceil($count/$nums);
查询数据,这边需要关联表查询用的是左查询的方式,通过for循环进行每页的写入文件
时间戳格式化直接使用了sql语句转换,省去进入循环后再次循环格式化 by user 悦悦 https://www.cnblogs.com/nuanai
1 FROM_UNIXTIME(updatetime, '%Y-%m-%d %H:%i:%s')
需要注意就是写入CSV之前需要对字段转一维数组
1 for($i=0;$i<$step;$i++){
2 $start = $i*$nums;
3 $result = $this->model->alias('pd')
4 ->join('products ps','ps.id=pd.product_id','LEFT')
5 ->join('step st','st.id=pd.step_id','LEFT')
6 ->field("pd.id,ps.name,ps.spec,st.name as sname,pd.barcode,pd.barnum,pd.isin,FROM_UNIXTIME(pd.updatetime, '%Y-%m-%d %H:%i:%s') AS uptime")->order("pd.updatetime","desc")->limit($start,$nums)->select();
7
8 foreach ($result as $K=> &$item) {
9 // 转换每行数据为一维数组
10 $rowData = [
11 $item['id'],
12 $item['name'],
13 $item['spec'],
14 $item['sname'],
15 $item['barcode'],
16 $item['barnum'],
17 $item['isin'],
18 $item['uptime']
19 ];
20
21 // 写入 CSV
22 fputcsv($fileHandle, $rowData);
23 }
24
25 }
开启了文件句柄,记得关闭
1 // 关闭文件句柄 2 fclose($fileHandle);
到这里就是可以将上万条数据导出CSV文件了,为了减少客户下载时间,又进行了对文件压缩,客户下载压缩文件。 by user 悦悦 https://www.cnblogs.com/nuanai
这里使用的调用方法,需要传入参数:文件名
1 if (!class_exists('ZipArchive')) {
2 throw new Exception(__('ZinArchive not install'));
3 }
4 $downloadPath = ROOT_PATH . 'public' .DS. 'uploads'.DS.'download'.DS; //服务器中文件zip保存的位置
5 $destDir = $downloadPath.$zipName . '.zip'; //全路径
6 $zip = new \ZipArchive; //压缩类
7 $zip->open($destDir, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
8 $csvDir = $downloadPath .$csvFileName.'.csv'; //需要压缩文件的全路径
9 $fileName = basename($csvDir); //获取文件名
10 $zip->addFile($csvDir, $fileName);
11 $zip->close();
12 $zipFilename = basename($destDir);
13 // 设置HTTP头信息
14 header('Content-Type: application/octet-stream');
15 header('Content-Disposition: attachment; filename="'.$zipFilename.'"');
16 header('Content-Length: ' . filesize($destDir));
17 // 读取并输出ZIP文件内容
18 readfile($destDir);
19 // 删除临时ZIP文件(可选)
20 unlink($destDir);
这边再生成压缩文件后,并删除了云服务器中的压缩文件,如果服务器空间允许看个人选择;如果想要删除服务器中的CSV文件,需要在生成压缩文件后进行删除操作
在第一个方法的最后添加如下代码:保存文件的路径 by user 悦悦 https://www.cnblogs.com/nuanai
1 unlink($destPath);
到这里就可以实现客户通过后台进行上万条数据的导出下载功能了,就是有一个弊端,需要等待浏览器跳出下载框,哎,给客户说一下耐心生成文件吧。
php不使用Office包实现上万条数据导出表格的更多相关文章
- JavaScript 上万条数据 导出Excel文件(改装版)
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- JavaScript 上万条数据 导出Excel文件 页面卡死
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- sqlserver 如何瞬间执行上万条数据
核心的内容是:使用自定义表类型 第一步:创建存储过程P_T1DeclareInfo_Upload_new 参数: T1DeclareInfo_UploadPNSN_Param 类型 T1Declar ...
- Android数据库更新——上万条数据的插入
在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...
- PHP导出3w条数据成表格
亲测有效,三万条数据秒秒钟导出 先进行数据表插入数据 ini_set('memory_limit','1024M'); //设置程序运行的内存 ini_set('max_execution_time' ...
- mysql 一次性插入上万条数据测试专用
无聊期间 记录下 mysql 一次性插入上万条数据 测试的时候可以用 首先 创建一个表 t3 create table t3(id int)ENGINE = MyISAM; \d // 表示吧m ...
- java向数据库插入N条数据
为了测试mysql的索引,要向数据库先插入上万条数据,然后再测试.手动插入太麻烦,写了一段代码. 先上代码: package action; import java.sql.Connection; i ...
- php插入上万条mysql数据最快的方法
1.使用thinkphp框架 先生成包含所有数据的数组,再使用 addAll() 方法,插入1万条数据仅需3秒钟. 2.PHP原始方法: 将SQL语句进行拼接,使用 insert into table ...
- Oracle的trunc和dbms_random.value随机取n条数据
今天在review项目代码的时候看到这样一个问题,有一张号码表,每次需要从这样表中随机取6个空闲的号码,也就是每次取出来的6个号码应该都会有所不同.然后我就看到了这样的SQL select t.* ...
- (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据
又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...
随机推荐
- MySQL—MySQL的存储引擎之InnoDB
MySQL-MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎 ...
- 实验2 C语言分支与循环基础应用编程 王刚202383310053
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 5 5 int ma ...
- 特权同学笔记-《边练边学》-在QP里调用modelsim的步骤
在QP里调用Modelsim需要先设置仿真参数和工具路径. 在QP调用modelsim的步骤 1. 在QP里建立工程,代码,分析综合:2. 添加testbench代码,processing-start ...
- 记录几十页html生成pdf的历程和坑(已用bookjs-easy解决)(生成、转换、拼接pdf)
懒得看的朋友,先说最终解决办法,主力为 前端依靠插件 bookjs-easy(点击直接跳转官网)并跳转到下面的第三点查看 接下来详细记录下整个试探的方向和历程 项目需求:是生成一个页数达到大几十页的p ...
- 如何基于surging跨网关跨语言进行缓存降级
概述 surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解 ...
- linux上PGI编译器安装
1.PGI编译器介绍 随着英伟达的收购,PGI编译器已经已经并入NVIDIA HPC SDK.后面直接安装NVIDIA HPC SDK即可. NVIDIA HPC SDK提供了使用标准的C/C++和F ...
- 网络流量分析 | AnaTraf 网络故障排除万用表教程更新: 如何抓取两个 MAC / IP 地址之间的流量?
AnaTraf 致力于提供国产化网络流量分析.网络可视化.网络故障排除解决方案. AnaTraf 网络万用表是一款实时的网络测量.流量分析工具,用于网络流量监控.识别网络性能瓶颈.快速排查网络问题. ...
- MySql类型转换函数cast
这两天处理一个现网的MySQL慢查询工单,学到了一个好用的MySQL函数:cast.事情是这样的: 我们有两张表 t_user 和 t_rule 表,需要关联这两张表去查询,关联字段是 t_user ...
- [第一届长城杯]-ez-python
----这道题似曾相识,和某刃的题目不能说不同,简直就一摸一样 ----考点:pickle序列化问题,命令执行 ----正常访问网站,源代码F12给出?pic=的提示,这种大致一看就是可以任意文件访问 ...
- 【C#】字符串按条件替换关键字
private string MyReplace(string json, string keyWord, string newWord, Func<string, string, bool&g ...