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);

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

相关文章
|
4天前
|
关系型数据库 MySQL 数据库连接
13 PHP数据的获取
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入理解PHP。本文介绍了从结果集中获取一行数据作为对象(`mysqli_fetch_object()`)、获取一行作为枚举数组(`mysqli_fetch_row()`)、获取查询结果集中的记录数(`mysqli_num_rows()`)、释放内存(`mysqli_free_result()`)以及关闭数据库连接(`mysqli_close()`)的方法,并提供了具体示例代码。
12 3
|
12天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
3月前
|
数据采集 PHP
PHP中实现简单爬虫与数据解析
【8月更文挑战第31天】在互联网的海洋里,爬虫技术如同一艘探索船,帮助我们搜集和理解信息。本文将带你通过PHP语言,轻松实现一个简单的网页内容抓取工具,并展示如何从抓取的数据中解析出有用信息。我们将一起航行在代码的波浪中,体验从无到有构建一个基本爬虫的过程。
|
3月前
|
数据采集 JavaScript 数据挖掘
如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据
本文介绍了使用PHP Simple HTML DOM Parser进行网页数据抓取的方法,尤其适用于从懂车帝二手车网站提取汽车品牌、价格和里程等关键信息。首先,安装并配置所需库,使用代理IP和设置cookie与useragent来模拟用户行为,避免被封。然后,通过编写PHP脚本,利用cURL获取网页内容,解析HTML并提取所需数据,最终将数据保存至CSV文件。文章强调了正确配置代理和用户代理的重要性,并提供了完整的PHP代码示例,以帮助读者理解和应用网页抓取技术。
如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据
|
5月前
|
Docker 容器
如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格(二)
使用Docker部署的WPS Office服务可以通过内网穿透工具Cpolar实现远程访问。首先,创建一个名为“wps office”的隧道,选择HTTP协议和3000端口,分配免费的随机域名,并指定中国地区。然后,通过Cpolar的管理界面获取HTTP公网地址,用以远程访问WPS Office。由于随机域名会变化,可以升级Cpolar套餐并保留一个二级子域名,确保长期稳定的远程访问。配置子域名后,更新隧道设置,完成固定公网地址的绑定,从而实现随时随地通过固定地址访问WPS Office。
|
4月前
|
前端开发 PHP 数据格式
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
161 0
|
5月前
|
存储 PHP
php处理带emoji表情的字符数据
php处理带emoji表情的字符数据
29 0
|
5月前
|
PHP
php+ajax传file文件数据
php+ajax传file文件数据
45 0
|
5月前
|
安全 Linux 网络安全
如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格(一)
在群晖NAS上使用Docker部署WPS Office并结合Cpolar内网穿透的步骤包括: 1. 通过SSH命令行拉取`linuxserver/wps-office`镜像。 2. 在群晖容器管理界面运行镜像,设置启动选项和端口映射。 3. 本地访问群晖IP:3000端口以使用WPS Office。 4. 安装Cpolar套件,手动添加并安装到群晖,通过9200端口访问其Web管理界面。 5. 使用Cpolar配置内网穿透,实现远程访问WPS Office。 这一过程允许用户即使在没有公网IP的情况下,也能通过Cpolar将内网的WPS Office服务暴露到公网,便于远程办公和文档处理。
|
5月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞