经过上传客户要求主副表迁出,又提出可以将某张表的数据导出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包实现上万条数据导出表格的更多相关文章

  1. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  2. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  3. sqlserver 如何瞬间执行上万条数据

    核心的内容是:使用自定义表类型 第一步:创建存储过程P_T1DeclareInfo_Upload_new 参数: T1DeclareInfo_UploadPNSN_Param  类型 T1Declar ...

  4. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  5. PHP导出3w条数据成表格

    亲测有效,三万条数据秒秒钟导出 先进行数据表插入数据 ini_set('memory_limit','1024M'); //设置程序运行的内存 ini_set('max_execution_time' ...

  6. mysql 一次性插入上万条数据测试专用

    无聊期间 记录下 mysql 一次性插入上万条数据 测试的时候可以用 首先 创建一个表 t3 create table t3(id int)ENGINE = MyISAM; \d //    表示吧m ...

  7. java向数据库插入N条数据

    为了测试mysql的索引,要向数据库先插入上万条数据,然后再测试.手动插入太麻烦,写了一段代码. 先上代码: package action; import java.sql.Connection; i ...

  8. php插入上万条mysql数据最快的方法

    1.使用thinkphp框架 先生成包含所有数据的数组,再使用 addAll() 方法,插入1万条数据仅需3秒钟. 2.PHP原始方法: 将SQL语句进行拼接,使用 insert into table ...

  9. Oracle的trunc和dbms_random.value随机取n条数据

    今天在review项目代码的时候看到这样一个问题,有一张号码表,每次需要从这样表中随机取6个空闲的号码,也就是每次取出来的6个号码应该都会有所不同.然后我就看到了这样的SQL select   t.* ...

  10. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...

随机推荐

  1. Raft 共识算法1-Raft基础

    Raft 共识算法1-Raft基础 Raft算法中译版地址:http://www.redisant.cn/etcd/contact 英原论文地址:https://raft.github.io/raft ...

  2. pandas:时间序列数据的周期转换

    时间序列数据是数据分析中经常遇到的类型,为了更多的挖掘出数据内部的信息,我们常常依据原始数据中的时间周期,将其转换成不同跨度的周期,然后再看数据是否会在新的周期上产生新的特性. 下面以模拟的K线数据为 ...

  3. C4996 scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details

    编译器报错,编译器使用的是Visual Studio2019版本 修改项目属性的检测sdl. 第一步,右键项目--->属性 *第二步,在打开的属性中选择,配置属性-->C/C++---&g ...

  4. MyBatis-Plus 实现多租户管理的实践

    本文主要讲解使用Mybatis-Plus结合dynamic-datasource来实现多租户管理 在现代企业应用中,多租户(Multi-Tenant)架构已经成为一个非常重要的设计模式.多租户架构允许 ...

  5. FolkMq v1.4.6 发布(可以内嵌的消息中间件)

    功能简表 角色 功能 生产者(客户端) 发布消息.定时消息(或叫延时).顺序消息.可过期消息.事务消息.支持 Qos0.Qos1 消费者(客户端) 订阅.取消订阅.消费-ACK(自动.手动) 服务端 ...

  6. Chart.js (v2.9.4)--如何像高版本一样支持skipNull

    项目开发中,用到Chart.js展示图表,用起来也非常方便,配置很灵活,很好用,给个数据集,设置一些配置值,实例化一个Chart出来,图表就非常丝滑地展现出来了. 但是作为开发人员都知道的一个真理,永 ...

  7. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

    1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) @ 目录 1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) 每博一文案 2. 大概的实现步骤概 ...

  8. 电脑临时文件清理2个方法?%temp% cleanmgr

    按住电脑快捷键win+R,打开运行框 输入代码 %temp%,点击回车enter或者点击确定,打开temp文件夹[此处存放的都是系统无用的缓存垃圾] 按快捷键Ctrl + A ,点击delete,删除 ...

  9. 改造 Kubernetes 自定义调度器

    原文出处:改造 Kubernetes 自定义调度器 | Jayden's Blog (jaydenchang.top) Overview Kubernetes 默认调度器在调度 Pod 时并不关心特殊 ...

  10. 创建 Vue3 项目

    前提条件 安装 Nodejs 下载:https://nodejs.org/en/download/prebuilt-installer 切换 npm 源 npm config set registry ...