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

php,office · 浏览次数 : 0

小编点评

以下是实现客户通过后台进行上万条数据导出下载功能的PHP代码示例: 1. 首先,设置程序需要一直运行并设置运行内存(PHP提示过128M): ```php set_time_limit(0); ini_set('memory_limit', '128M'); ``` 2. 设置文件名使用的日期命名: ```php $fileName = date('YmdHis', time()); ``` 3. 设置文件保存位置: ```php $destPath = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'download' . DS . $fileName . '.csv'; ``` 4. 打开文件句柄,准备写入数据: ```php $fileHandle = fopen($destPath, 'w'); ``` 5. 检查文件句柄是否成功打开: ```php if ($fileHandle === false) { die('无法打开文件: ' . $fileHandle); } ``` 6. 写入表头: ```php fputcsv($fileHandle, ['序号', '产品名称', '产品型号', '工名称', '条码1', '条码2', '状态', '时间']); ``` 7. 查询数据并进行分页导出: ```php $nums = 10000; $count = $this->model->count(); $step = ceil($count / $nums); for ($i = 0; $i < $step; $i++) { $start = $i * $nums; $result = $this->model->alias('pd') ->join('products ps', 'ps.id = pd.product_id', 'LEFT') ->join('step st', 'st.id = pd.step_id', 'LEFT') ->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(); foreach ($result as $K => &$item) { // 转换每行数据为一维数组 $rowData = [ $item['id'], $item['name'], $item['spec'], $item['sname'], $item['barcode'], $item['barnum'], $item['isin'], $item['uptime'] ]; // 写入 CSV fputcsv($fileHandle, $rowData); } } // 关闭文件句柄 fclose($fileHandle); ``` 8. 生成压缩文件并下载: ```php // 压缩文件保存的位置 $downloadPath = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'download' . DS; // 创建压缩文件并添加CSV文件 $zipName = 'export-' . $fileName . '.zip'; $destDir = $downloadPath . $zipName . '.zip'; $zip = new ZipArchive; $zip->open($destDir, ZipArchive::CREATE | ZipArchive::OVERWRITE); $csvDir = $downloadPath . $csvFileName . '.csv'; $fileName = basename($csvDir); $zip->addFile($csvDir, $fileName); // 关闭压缩文件 $zip->close(); // 设置HTTP头信息 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $zipName . '"'); header('Content-Length: ' . filesize($destDir)); // 读取并输出ZIP文件内容 readfile($destDir); // 删除临时ZIP文件(可选) unlink($destDir); ``` 这个PHP代码示例可以让您实现将上万条数据导出为CSV文件的功能,并支持分页和文件压缩。客户可以通过后台下载生成的压缩文件。

正文

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

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

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

[转帖]linux,wget 的证书不可信,证书使用不安全的算法签名

centos wget 的证书不可信,证书使用不安全的算法签名 wget wget https://www.php.net/distributions/php-7.4.28.tar.gz 出现错误: wget https://www.php.net/distributions/php-7.4.28.

PHP转Go系列 | GET 和 POST 请求的使用姿势

大家好,我是码农先森。 说到 HTTP 请求工具想必对我们做 Web 开发的程序员都不陌生,只要涉及到网络请求都必须使用。对于我们 PHP 程序员来说,最熟悉不过的就是 CURL 扩展,只要安装的这个扩展便可随意发起 HTTP 请求。 但在 PHP 语言中还有一个很好用的 Composer 包「gu

禅道的使用:如何搭建Ubuntu环境安装禅道

一、禅道安装部署的环境要求 1.禅道安装部署环境推荐使用 Linux + Apache + PHP7.0以上版本+ MySQL5.5以上版本/MariaDB的组合。Nginx其次,不推荐IIS + PHP组合。 2.禅道需要使用PHP的这些扩展:pdo、pdo_mysql、json、filte、op

[转帖]Shell字符串拼接(连接、合并)

http://c.biancheng.net/view/1114.html 在脚本语言中,字符串的拼接(也称字符串连接或者字符串合并)往往都非常简单,例如: 在 PHP 中,使用.即可连接两个字符串; 在 JavaScript 中,使用+即可将两个字符串合并为一个。 然而,在 Shell 中你不需要

go高并发之路——go语言如何解决并发问题

一、选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但21年之后的新项目基本上就都

php+sql后台实现从主表迁出至副表(数据超万条)

上万条甚至上百万数据进行迁出做备份或者进行不妨碍原系统数据的操作,现在很多企业都会用到,目前就需要将上百万条数据进行迁出到副表保存并操作,直接再后台写一个按钮进行操作,既方便操作也不会很慢。毕竟是客户需要,不能每次迁出都要客户去数据库操作,操作的不好那数据危险度挺高的。 1、分页查询数据库主表数据

【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答

问题描述 PHP应用再连接Azure Redis服务时,出现Connection Timed out。当通过升级提高Azure Redis的性能时候,发现之前的数据丢失了。 问题解答 当Redis服务出现Timeout的情况时,可以从Redis服务的指标(Metrics)开始查看,如果出现负载(Se

PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践

大家好,我是码农先森。 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念。PHP 服务端和前端 HTML、CSS、JS 代码混合式开发,也不分前端、后端程序员,大家都是全干工程师。随着前后端分离、移动端开发的兴起,用后端渲染数据的开发方式效率低下,已经不能满足业务对需求快速上线的要

CentOS7系统搭建web环境 php&nginx&pgsql

环境:VMware、CentOS-7-x86_64-DVD-2009.iso、nginx-1.26.1、php-7.2.0、postgresql-12 php最好安装对应php项目所需版本,否则会出现不兼容问题。 一、VMware安装CentOS7操作系统 下载 Linux Centos 7 映像: