TL;DR: 本文介绍 Laravel 的 FastExcel 组件,文中会对 PHP generators 速览,并给出如何在节约内存的同时结合两者从数据集生成 Excel 文件。

关于 FastExcel

Laravel FastExcel 旨在成为 Laravel 风格的 Spout, 目的是简化 导入 / 导出。它可以看作是 Laravel Excel 的一种更快(且对内存更友好)的替代方案,只是方法不同且功能较少。 分两步实施。

首先,composer 方式安装:

composer require rap2hpoutre/fast-excel

然后,导出一个 Model 或者 Collection to XLSXCSV or ODS:

fastexcel($collection)->export('file.xlsx');

更多详情请参考 README of the project homepage.

Generators(生成器)

Generators 于多年前在 PHP 5 中引入。「生成器」函数很像普通函数,只是它不返回一个确定值,而是「生成器」yields 值,以便你根据需求生成需要迭代的值。

此类函数的目标之一是 延迟迭代 数据而不构建数组。因此,在处理大型数据集时可以节约内存。详情请参考 PHP 文档:

「生成器」允许你在 foreach 代码块中编写代码来遍历一组数据,而无需在内存中构建数组。因为那样可能会导致超出内存限制,或需要大量的处理时间才能生成。

假定现在有一个 User 模型,数据库中有 10M+ 条,你想在代码中迭代它们,除了调用 User::all(), 你也可以使用「生成器」:

function usersGenerator() {foreach (User::cursor() as $user) {yield $user;}
}$users = usersGenerator();
foreach($users as $user) {// Do something with each user without hitting memory limit
}

上面这个示例在运行查询时是一个接一个地取出用户数据。它仅仅是使用加载一个用户所需的内存 N 次。

使用 FastExcel 和 Generators 导出大型数据集

从 v1.3.0 起, FastExcel 接受一个生成器函数作为参数。接前面的示例,你可以将生成器传递给 fastexcel 函数:

function usersGenerator() {foreach (User::cursor() as $user) {yield $user;}
}// Export consumes only a few MB, even with 10M+ rows.
$users = usersGenerator();
fastexcel($users)->export('test.xlsx');

FastExcel 在内部使用生成器时是一行一行地创建,因此不会消耗额外的内存。这会是一个耗时操作,因此请确保不会触到 max_execution_time 限制 (你可以使用队列、 任何的异步技术、增加最大执行时间、甚至是从 CLI 执行)。尽管这样,仍然要注意,不要因一个导出操作耗尽你的服务器所有的内存。

因此,借助「生成器」,你现在可以在 Laravel 项目中使用几行代码将成千上万个模型数据导出到 XLSX,CSV 和 ODS 文件中。

欲了解这个组件的更详细信息请移步到: https://github.com/rap2hpoutre/fast-excel

转自链接:Laravel 教程:使用 Fast Excel 解决导出超大 XLSX 文件(千万级)带来的内存问题

更多学习内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​zhuanlan.zhihu.com

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

Laravel 教程:使用Fast Excel解决导出超大 XLSX 文件(千万级)带来的内存问题相关推荐

  1. Java程序利用POJ读写Excel的.xls或.xlsx文件所需的3个jar包

    Java程序利用POJ读写Excel文件时,不能只用poi的jar包,因为它还依赖于xmlbeans的jar包,xmlbeans又以来与common-collections的jar包,因此,正常使用P ...

  2. 用Java将Excel的xls和xlsx文件转换成csv文件的方法, XLS2CSV, XLSX2CSV

    利用poi将excel文件后缀为.xls .xlsx的文件转换成txt/csv文本文件 首先,引入所需的jar包: <dependencies>2 <dependency>3 ...

  3. Laravel Excel3.1 实现Excel的导出和导入读取添加进数据库

    最近在学习laravel框架,自己按照以往的学习情况,想要做一个在表单页导出Excel和导入Excel实现批量添加信息到数据库的demo,记录下laravel Excel3.1的简单使用. 官方文档: ...

  4. python xmind 包使用 (其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)

    pip install xmind 使用 場景 xmind8 可以打开 xmind2020 报错 main_fest.xml(xmind8 打开另存后 更改后缀为.zip 里边包含META-INF/m ...

  5. springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏

  6. npoi xlsx 文件损坏_解决右键新建xlsx文件错误

    问题发现 近日在使用Windows文件资源管理器,右键新建 XLSX 工作表 ,打开文件,EXCEL报错 Excel 无法打开文件 "***.xlsx", 因为文件格式或文件扩展名 ...

  7. 解决右键新建xlsx文件错误

    问题发现 近日在使用Windows文件资源管理器,右键新建 XLSX 工作表 ,打开文件,EXCEL报错 Excel 无法打开文件 "***.xlsx", 因为文件格式或文件扩展名 ...

  8. 【ArcMap】解决csv,xlsx文件打不开的问题、坐标点数据可视化方法

    今天又记录一个小问题- 想在ArcMap里打开csv文件再利用坐标生成点数据 结果点[文件]→[添加数据]→[添加XY数据]就看不到表文件,直接在文件夹里把表拖进去就会显示无法打开- 搜了一晚上这个问 ...

  9. 解决IDEA项目中文件夹层级显示(小数点形式与文件夹层级形式)

    1.target文件夹隐藏 一般创建的maven项目初始文件夹如下,有个target文件夹平常基本用不到 我们可以通过,取消勾选这一项来隐藏 2.文件夹的层级显示设置 一种是层级文件夹显示 另一种通过 ...

最新文章

  1. LabVIEW设置应用程序显示标签透明
  2. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
  3. android筛选cookie,服务器无法从Android手机识别Cookie
  4. 如何处理跨平台的自适应三
  5. 单片机模块学习之键盘
  6. log4j控制台乱码解决办法
  7. VTK:可视化算法之BluntStreamlines
  8. Design Compiler指南——概述和基本流程
  9. 开发人员对Spring vs JavaEE的看法
  10. mybatis一级,二级缓存。缓存带来的脏读问题
  11. poj3279 反转 挑战程序设计竞赛
  12. Windows Communication Foundation from msdn
  13. Java 中的细节补充
  14. android系统中与内存有关的文件及路径
  15. pg_restore使用
  16. python实现代码_python感知机实现代码
  17. 循环嵌套外小内大原则
  18. 卷积编码--维特比译码
  19. 二、鼎捷T100总账管理之核算项管理篇
  20. 翻译Allegorithmic的文档《THE PBR GUIDE - PART 1》

热门文章

  1. anaconda更改虚拟环境安装位置
  2. 形容谣言的四字词语_描写传递信息的四字词语
  3. 优化华为云服务器采用Key登陆
  4. Kali下卸载程序和安装程序的方法
  5. 禁用计算机硬盘,禁止电脑每次开机都要自动扫描磁盘的多种方法
  6. 写给程序员的管理入门课程 -《格鲁夫给经理人的第一课》
  7. 深度学习入门之神经网络的学习思维导图
  8. linux中默认文件666和目录777的权限关系
  9. 关于睡眠你应该知道的十件事
  10. 字母金字塔(类同数字金字塔)