PHP海量excel数据导出方案解决 xlswriter性能测试
2021年5月28日19:29:20
xlswriter 中文官方网站 https://xlswriter-docs.viest.me/zh-cn
windows10 环境laravel8 mysql8
第一次执行会慢一点,第二次就更快一点,服务器上开了opcache估计会更快一点
public function test(Request $request){$start_time = date('Y-m-d H:i:s');ini_set('memory_limit', '1024m');$config = ['path' => public_path() . '/upload' // xlsx文件保存路径];$excel = new Excel($config);$textFile = $excel->fileName("free.xlsx")->header(['id', 'name', 'phone', 'source', 'province_name', 'city_name', 'data_time', 'user_id', 'user_nickname', 'register_time', 'up_user_id', 'store_name', 'is_pull_new']);//大约11万数据foreach (BrokerMemberData::get() as $k => $v) {$textFile->insertText($k+1, 0, $v->id);$textFile->insertText($k+1, 1, $v->name);$textFile->insertText($k+1, 2, $v->phone);$textFile->insertText($k+1, 3, $v->source);$textFile->insertText($k+1, 4, $v->province_name);$textFile->insertText($k+1, 5, $v->city_name);$textFile->insertText($k+1, 6, $v->data_time);$textFile->insertText($k+1, 7, $v->user_id);$textFile->insertText($k+1, 8, $v->user_nickname);$textFile->insertText($k+1, 9, $v->register_time);$textFile->insertText($k+1, 10, $v->up_user_id);$textFile->insertText($k+1, 11, $v->store_name);$textFile->insertText($k+1, 12, $v->is_pull_new);}$filePath = $textFile->output();p(BrokerMemberData::count());p('执行成功 开始时间' . $start_time . '结束时间' . date('Y-m-d H:i:s'));p($filePath);}
执行结果
115135
执行成功 开始时间2021-05-29 10:45:04结束时间2021-05-29 10:45:10
D:\phpstudy_pro\WWW\mc\public/upload/free.xlsx
orm里面使用
BrokerMemberData::where('id', '>', 0)->chunkById(10000, function ($list) use ($textFile) {foreach ($list as $k => $v) {$textFile->insertText($v->id + 1, 0, $v->id);$textFile->insertText($v->id + 1, 1, $v->name);$textFile->insertText($v->id + 1, 2, $v->phone);$textFile->insertText($v->id + 1, 3, $v->source);$textFile->insertText($v->id + 1, 4, $v->province_name);$textFile->insertText($v->id + 1, 5, $v->city_name);$textFile->insertText($v->id + 1, 6, $v->data_time);$textFile->insertText($v->id + 1, 7, $v->user_id);$textFile->insertText($v->id + 1, 8, $v->user_nickname);$textFile->insertText($v->id + 1, 9, $v->register_time);$textFile->insertText($v->id + 1, 10, $v->up_user_id);$textFile->insertText($v->id + 1, 11, $v->store_name);$textFile->insertText($v->id + 1, 12, $v->is_pull_new);
// pp($textFile);
// p($t++);}});
每次跑20000D:\phpstudy_pro\WWW\mc>php artisan Zx
初始: 17.759658813477MB
<pre>115135</pre><pre>执行成功 开始时间2021-05-29 19:09:18结束时间2021-05-29 19:09:34</pre><pre>D:\phpstudy_pro\WWW\mc\public/upload/free.xlsx</pre>释放: 19.283096313477MB
峰值: 53.145240783691MB
15000
D:\phpstudy_pro\WWW\mc>php artisan Zx
初始: 17.759658813477MB
<pre>115135</pre><pre>执行成功 开始时间2021-05-29 19:09:53结束时间2021-05-29 19:10:08</pre><pre>D:\phpstudy_pro\WWW\mc\public/upload/free.xlsx</pre>释放: 19.287315368652MB
峰值: 37.001892089844MB
8000
D:\phpstudy_pro\WWW\mc>php artisan Zx
初始: 17.759658813477MB
<pre>115135</pre><pre>执行成功 开始时间2021-05-29 19:10:26结束时间2021-05-29 19:10:46</pre><pre>D:\phpstudy_pro\WWW\mc\public/upload/free.xlsx</pre>释放: 19.13597869873MB
峰值: 20.823844909668MB
10000
D:\phpstudy_pro\WWW\mc>php artisan Zx
初始: 17.759658813477MB
<pre>115135</pre><pre>执行成功 开始时间2021-05-29 19:10:56结束时间2021-05-29 19:11:11</pre><pre>D:\phpstudy_pro\WWW\mc\public/upload/free.xlsx</pre>释放: 19.285507202148MB
峰值: 42.986419677734MB
其他方案:
$fp = fopen('php://output', 'a');// 输出Excel列名信息
$head = array("电子邮件");
foreach ($head as $i => $v) {// CSV的Excel支持GBK编码,一定要转换,否则乱码$head[$i] = iconv('utf-8', 'gbk', $v);
}// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;// 逐行取出数据,不浪费内存
$count = count($email);for($t=0;$t<$count;$t++) {$cnt ++;if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题ob_flush();flush();$cnt = 0;}$row[] = $email[$t];foreach ($row as $i => $v) {$row[$i] = iconv('utf-8', 'gbk', $v);}fputcsv($fp, $row);unset($row);
}
这种方案对待简单的excel是可行的,但是需要制作复杂的excel就无能为力
SELECT*
FROMtable_name
INTO OUTFILE 'D:/test.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';SELECT * FROM data_international into outfile
'd:/zx.xls';受影响的行: 436593
时间: 0.523sTRUNCATE TABLE data_international;<br>
LOAD DATA INFILE
'd:/zx.xls'
INTO TABLE data_international;受影响的行: 436593
时间: 2.453s
复杂一些的sql参考
https://www.cnblogs.com/zx-admin/p/5174796.html
3,异步任务
吧excel导出的任务,写入到一个队列,这个可以是redis的队列,也可以是mq的生产队列,
然后写一个消费队列是消费,在cli模式下执行不担心请求超时,然后执行完成,写消息返回给用,可以使用socket通知用户,也可以写一条mysql记录,告诉用户下载地址
很多需要大数量导出的系统都是采用这个方案
但是这个方案有个缺点就是海量数据导出很容易,内存溢出
4,数据流,边刷出文件流,边提供下下载,还是容易超时
5,分文件拆分处理生成 file1.xls,file2.xls,file3.xls,然后合并,减少内存和处问题,但是这个依然会出现硬盘和内存飙升
6,
PHP海量excel数据导出方案解决 xlswriter性能测试相关推荐
- 利用ajax实现excel报表导出(解决乱码问题)
利用ajax实现excel报表导出[解决乱码问题] 背景 第一版 主要代码 测试结果 第二版 主要代码 测试结果 总结 背景 项目中遇到一个场景,要导出一个excel报表.由于需要token验证,所以 ...
- mac r 导出csv文件_mac系统中的Excel数据导出
最近自己正在练习写一个类似通讯录的App.所有联系人的通讯信息存在一个Excel的文件当中,如下图所示 Snip20160903_1.png 如果要在iOS中使用上面的数据,就需要将Excel中的数据 ...
- Excel数据导出图片
表格数据导出图片 pom.xml引入Spire配置 <!-- Excel转换工具 参考 https://www.e-iceblue.cn/licensing/install-spirepdf-f ...
- xlsxwriter进度条php,PHP导出Excel数据导出,前端进度条实现方式
效果如上,结合layer组件以及ajax分页实现,具体代码如下 前端代码 用户数据导出 // 执行事件 function exportData() { var loading = layer.load ...
- 微信公众号自动回复服务器数据,[终极方案]解决微信公众号服务器配置启用后无法自动回...
在配置服务器配置时Token验证通过后,遇到给公众号发信息,提示:提示该公众号提供的服务出现故障,请稍后再试 的问题,一直实现不了自动回复的功能.百度了大量的资料,参考了开发文档,尝试了n种办法,检查 ...
- Dcat-Admin自定义Excel数据导出
dact-admin框架支持导出 csv. xlsx 和 ods 等格式文件,在控制器内grid−>export()−>titles(grid->export()->title ...
- springboot新手项目从零开始搭建,涉及excel数据导出和邮箱发送(上)
项目创建 idea点击New Project 创建一个新项目 左上角打开点击File打开设置 maven设置 这样 我们的项目就创建完毕了 点开左边的pom文档 将提供的依赖导入 我之前就存在一个冲突 ...
- 分分钟搞定 Excel 数据导出
1. 概览 数据导出是日常开发的常见功能,及将数据导出为Excel并提供下载.Java 生态存在大量的 Excel 操作类库,基于这些类库便可完成相关功能.这样,大量繁杂.无意义的代码耗费着宝贵的人力 ...
- java使用poi的excel数据导出及线上预览
工作中经常会遇到需要从数据库中获取数据,整理后导出数据到excel中提供其他人员下载或者查看,整体功能并不复杂,今天提供一个基于poi工具+永中云预览的excel通用导出在线查看的方法 maven依赖 ...
最新文章
- PHP使用BC Math 函数处理浮点运算问题
- Ubuntu 下添加OpenERP command 快捷启动方式
- cocos2d-x 帧动画学习
- 让时间倒流的保存点:用Apache Flink的保存点技术重新处理数据流
- NIO 之 Channel实现原理
- QT的QActionGroup类的使用
- docker中创建redis及在外部使用rdm连接
- 《转》请放下你的无效社交
- CSS清除默认样式,技术详细介绍
- 无人驾驶出租车遭警察拦截后欲“潜逃”,AI 是原罪?
- python作业atm_python完成ATM(分目录)
- Presto架构及原理、安装及部署
- 【历史上的今天】8月19日:大型计算机先驱和小型机之父诞生;中国雅虎邮箱成历史...
- nmap隐藏自己扫描
- Win10禁用UAC(用户账户控制)
- 物联网医疗康复AI软件项目找团队合作
- 朴素贝叶斯——凉鞋问题
- <!DOCTYPE html>是什么意思?
- dns配置异常怎么修复_win10 dns异常怎么修复
- nas存储如何做远程服务器数据备份_NAS存储与数据备份方案
热门文章
- php+拆分gif,PHP批量下载五笔字根拆分解GIF图
- JavaScript:回调函数(callback)
- ubuntu桌面图标消失
- D. Absolute Sorting
- ArcGIS处理多维栅格NC格式的全球土壤数据集
- 如何绘制产业招商地图
- TI Sitara AM57x DSP+ARM + Xilinx Artix-7 FPGA开发板 规格书资料
- Java 加解密技术之 MD5
- 举例 | 轻松读懂“实验”与“试验”的区别
- 杭电ACM 1089-1096