php不使用Office包实现上万条数据导出表格

简介: 经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白。要是使用office包目前后台内存耗尽,被迫停止运行,所以想要突破百万条数据导出需要另辟它路。所以就是使用了导出CSV并非excel文件。1、设置程序需要一直运行并设置运行内存(php提示过128M)

经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白。

要是使用office包目前后台内存耗尽,被迫停止运行,所以想要突破百万条数据导出需要另辟它路。所以就是使用了导出CSV并非excel文件。

1、设置程序需要一直运行并设置运行内存(php提示过128M)

2、数据查询出需要导出的数据字段(分页)

3、分页进行导出文件并一起合并成压缩包后下载

如果导出前需要某些条件筛选,那就需要在前端设置表单提交筛选条件(不过多介绍)

导出配置的编写,需要设置文件路径、名称、表头等基本信息

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语句转换,省去进入循环后再次循环格式化

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文件了,为了减少客户下载时间,又进行了对文件压缩,客户下载压缩文件。

这里使用的调用方法,需要传入参数:文件名  

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文件,需要在生成压缩文件后进行删除操作

在第一个方法的最后添加如下代码:保存文件的路径

1 unlink($destPath);

到这里就可以实现客户通过后台进行上万条数据的导出下载功能了,就是有一个弊端,需要等待浏览器跳出下载框,哎,给客户说一下耐心生成文件吧。

目录
打赏
0
0
0
0
4
分享
相关文章
PHP中的数组处理艺术:灵活高效的数据操作
PHP中的数组处理艺术:灵活高效的数据操作
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
139 67
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
230 8
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。 isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
本文介绍了如何使用PHP模拟表单提交并结合代理IP技术抓取京东商品的实时名称和价格,特别是在电商大促期间的数据采集需求。通过cURL发送POST请求,设置User-Agent和Cookie,使用代理IP绕过限制,解析返回数据,展示了完整代码示例。
199 3
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
|
9月前
|
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
169 5
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
212 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问