PHP导出百万数据到Excel文件
时间:2021-08-28
本文章向大家介绍PHP导出百万数据到Excel文件,主要包括PHP导出百万数据到Excel文件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
导出大容量的数据主要是因为持续占用内存,系统容易崩溃,下面我用过的两种办法都可以
1.我们可以更改服务器配置,找到以下几个配置参数,让他导出的时候不会因为时间长挂掉
fastcgi_connect_timeout 750000; #链接
fastcgi_read_timeout 600000; #读取
fastcgi_send_timeout 600000; #发请求
2 就是在导出过程中释放我们的缓存区
先封装一个导出类包 xlsTools.php (复制粘贴一把梭)
<?php /*这个是类包*/ class xlsTools{ var $inEncode='utf-8'; var $outEncode='gb2312'; protected $rowCount; //存储已经存在内存中的记录条数 protected $rowFlushCount; // 一次flush的数据条数 public function __construct( $rowFlushCount = 1000 ) { $this->rowFlushCount = $rowFlushCount; $this->rowCount = 0; } public function __destruct() { // TODO: Implement __destruct() method. } public function start($param){ // todo 文件名这里建议允许自定 ddcoder $filename = $param['type'].'-'.date('YmdHis').'('.$param['name'].')'; $this->doStart($param['title'],$filename); } public function doStart($keys,$filename){ $this->download($filename.'.xls'); // php输出到缓冲区 echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style>td{vnd.ms-excel.numberformat:@}</style></head>'; echo '<table width="100%" border="1">'; // 有时候需要自定义表头 ddcdoer 修改于2017-08-26 if ( $keys ) { echo '<tr><th filter=all>'.implode('</th><th filter=all>',$keys)."</th></tr>\r\n"; } //刷新缓冲区 ob_flush(); flush(); } //下载文件 //$mimeType = 'application/force-download' //Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet //$mimeType = 'application/vnd.ms-excel' function download($fname = 'data', $data = null, $mimeType = 'application/force-download') { if (headers_sent($file, $line)) { echo 'Header already sent @ ' . $file . ':' . $line; exit(); } //header('Cache-Control: no-cache;must-revalidate'); // //fix ie download bug header('Pragma: no-cache, no-store'); header("Expires: Wed, 26 Feb 1997 08:21:57 GMT"); if (strpos($_SERVER["HTTP_USER_AGENT"], 'MSIE')) { $fname = urlencode($fname); header('Content-type: ' . $mimeType); } else { header('Content-type: ' . $mimeType . ';charset=utf-8'); } header("Content-Disposition: attachment; filename=\"" . $fname . '"'); //header( "Content-Description: File Transfer"); if ($data) { header('Content-Length: ' . strlen($data)); echo $data; exit(); } } public function csv_export($keys , $expData , $type , $count) { $csv = ''; foreach ($keys as $key){ $csv .= '"'.iconv("UTF-8", "gb2312",$key).'",'; } $csv .= "\n"; foreach($expData as $expArr) { foreach ($expArr as $e_key=>$exp){ $csv .= iconv("UTF-8", "gbk",$this->escapeCSV($expArr[$e_key])) . ','; } $csv .= "\n"; } ob_end_clean(); $fileName = $type.'-'.date('YmdHis').'('.$count.').csv'; header("Content-type:text/csv"); header("Content-Disposition:attachment;filename=".iconv("UTF-8", "gb2312",$fileName)); header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); header('Expires:0'); header('Pragma:public'); ob_end_clean(); echo $csv; } /** * 生成并下载csv文件 */ public function csv_export_f($keys , $expData , $fileName) { // export file $csv = ''; foreach ($keys as $key){ $csv .= '"'.iconv("UTF-8", "gb2312",$key).'",'; } $csv .= "\n"; foreach($expData as $expArr) { foreach ($expArr as $e_key=>$exp){ $csv .= iconv("UTF-8", "gbk",$this->escapeCSV($expArr[$e_key])) . ','; } $csv .= "\n"; } ob_end_clean(); $fileName .= '.csv'; header("Content-type:text/csv"); header("Content-Disposition:attachment;filename=".iconv("UTF-8", "gb2312",$fileName)); header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); header('Expires:0'); header('Pragma:public'); ob_end_clean(); echo $csv; } function escapeCSV($str){ $str = str_replace(array(',','"',"\n\r"),array('','""',''),$str); if($str == ""){ $str = '""'; } return $str; } public function allData($rows) { foreach($rows as $row){ echo '<tr><td>'.implode('</td><td>',$row)."</td></tr>\r\n"; } ob_flush(); flush(); } public function oneData($row) { echo '<tr><td>'.implode('</td><td>',$row)."</td></tr>\r\n"; ob_flush(); flush(); } function end(){ echo '</table>'; ob_flush(); flush(); } /* * 多条数据flush一次 默认1000,有初始化对象决定 * */ public function multiData( $row ) { $this->rowCount++; echo '<tr><td>'.implode('</td><td>',$row)."</td></tr>\r\n"; if( $this->rowCount >= $this->rowFlushCount ) { ob_flush(); flush(); } } }
类包封装完成后就可以写业务代码,导出的数据了
<?php /*导出1000000万条数据实例*/ /*导入类包*/ require('xlsTools.php'); /*实例化类包*/ $xlsTools = new xlsTools(); //定义列名和导出名称以及格式 $xlsTools->start([ 'title'=>['列名1','列名2'], //列名 'type'=>'xls', //导出的excel的类型 'name'=>'导出' //导出的excel的文件名 ]); /* 导出100万条(1000000条)示例 */ //这里可以是我们数据库查出来的数据,按照这种格式拼装即可 for ($i=0; $i<1000000; $i++){ $row = ['列值1'=>1,'列值2'=>'x']; //输出数据,并刷新缓冲区 $xlsTools->oneData($row); } /*结束导出*/ $xlsTools->end();
按自己的业务需求查出数据使用即可
注:虽然导出的数据不会崩溃,但是过百万的数据导出时间过长,需要配置服务器最大请求时间
原文地址:https://www.cnblogs.com/bkhdd/p/15200498.html
- Java8-如何构建一个Stream
- 2016: [Usaco2010]Chocolate Eating
- javascript 闭包详解
- 3016: [Usaco2012 Nov]Clumsy Cows
- POJ 3207 Ikki's Story IV - Panda's Trick(2-SAT)
- 3359: [Usaco2004 Jan]矩形
- 漫谈Java IO之 Netty与NIO服务器
- Java线程的几种状态
- POJ3683 Priest John's Busiest Day(2-SAT)
- javascript 面向对象(实现继承的几种方式)
- Base64 的 JavaScript 实现 js-base64
- HTTP请求详解
- 漫谈Java IO之 NIO那些事儿
- 1593: [Usaco2008 Feb]Hotel 旅馆
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC