感谢 Spout,Laravel 的快速 Excel 导入/导出。请参阅下面的基准。
通过作曲家安装:
composer require rap2hpoutre/fast-excel
将模型导出到.xlsx
文件:
use Rap2hpoutre FastExcel FastExcel ;
use App User ;
// Load users
$ users = User:: all ();
// Export all users
( new FastExcel ( $ users ))-> export ( ' file.xlsx ' );
导出模型或集合:
$ list = collect ([
[ ' id ' => 1 , ' name ' => ' Jane ' ],
[ ' id ' => 2 , ' name ' => ' John ' ],
]);
( new FastExcel ( $ list ))-> export ( ' file.xlsx ' );
导出xlsx
、 ods
和csv
:
$ invoices = App Invoice:: orderBy ( ' created_at ' , ' DESC ' )-> get ();
( new FastExcel ( $ invoices ))-> export ( ' invoices.csv ' );
仅导出一些指定列名称的属性:
( new FastExcel (User:: all ()))-> export ( ' users.csv ' , function ( $ user ) {
return [
' Email ' => $ user -> email ,
' First Name ' => $ user -> firstname ,
' Last Name ' => strtoupper ( $ user -> lastname ),
];
});
下载(从控制器方法):
return ( new FastExcel (User:: all ()))-> download ( ' file.xlsx ' );
import
返回一个集合:
$ collection = ( new FastExcel )-> import ( ' file.xlsx ' );
导入具有特定分隔符、封装字符和“gbk”编码的csv
:
$ collection = ( new FastExcel )-> configureCsv ( ' ; ' , ' # ' , ' gbk ' )-> import ( ' file.csv ' );
导入并插入数据库:
$ users = ( new FastExcel )-> import ( ' file.xlsx ' , function ( $ line ) {
return User:: create ([
' name ' => $ line [ ' Name ' ],
' email ' => $ line [ ' Email ' ]
]);
});
您可以将 FastExcel 与可选的 Facade 一起使用。将以下行添加到aliases
键下的config/app.php
中。
' FastExcel ' => Rap2hpoutre FastExcel Facades FastExcel::class,
使用 Facade,您将无法访问构造函数。您可以使用data
方法设置导出数据。
$ list = collect ([
[ ' id ' => 1 , ' name ' => ' Jane ' ],
[ ' id ' => 2 , ' name ' => ' John ' ],
]);
FastExcel:: data ( $ list )-> export ( ' file.xlsx ' );
FastExcel 提供了一个方便的全局帮助器,可以在 Laravel 应用程序中的任何位置快速实例化 FastExcel 类。
$ collection = fastexcel ()-> import ( ' file.xlsx ' );
fastexcel ( $ collection )-> export ( ' file.xlsx ' );
通过创建SheetCollection
导出多个工作表:
$ sheets = new SheetCollection ([
User:: all (),
Project:: all ()
]);
( new FastExcel ( $ sheets ))-> export ( ' file.xlsx ' );
使用索引指定工作表名称:
$ sheets = new SheetCollection ([
' Users ' => User:: all (),
' Second sheet ' => Project:: all ()
]);
使用importSheets
导入多个工作表:
$ sheets = ( new FastExcel )-> importSheets ( ' file.xlsx ' );
您还可以按编号导入特定工作表:
$ users = ( new FastExcel )-> sheet ( 3 )-> import ( ' file.xlsx ' );
导入具有工作表名称的多个工作表:
$ sheets = ( new FastExcel )-> withSheetsNames ()-> importSheets ( ' file.xlsx ' );
使用yield
逐一导出行以避免memory_limit
问题:
function usersGenerator () {
foreach (User:: cursor () as $ user ) {
yield $ user ;
}
}
// Export consumes only a few MB, even with 10M+ rows.
( new FastExcel ( usersGenerator ()))-> export ( ' test.xlsx ' );
使用headerStyle
和rowsStyle
方法添加标题和行样式。
use OpenSpout Common Entity Style Style ;
$ header_style = ( new Style ())-> setFontBold ();
$ rows_style = ( new Style ())
-> setFontSize ( 15 )
-> setShouldWrapText ()
-> setBackgroundColor ( " EDEDED " );
return ( new FastExcel ( $ list ))
-> headerStyle ( $ header_style )
-> rowsStyle ( $ rows_style )
-> download ( ' file.xlsx ' );
FastExcel 旨在成为 Laravel 风格的 Spout:一个简单但优雅的 Spout 包装器,其目标是简化导入和导出。它可以被认为是 Laravel Excel 的更快(且内存友好)的替代品,但功能较少。仅将其用于简单任务。
在 MacBook Pro 2015 2.7 GHz Intel Core i5 16 Go 1867 MHz DDR3 上进行测试。使用随机数据测试 XLSX 导出的 10000 行、20 列、10 次迭代,2018-04-05。不要相信基准。
平均内存峰值使用率 | 执行时间 | |
---|---|---|
Laravel Excel | 123.56M | 11.56秒 |
快速Excel | 209米 | 2.76秒 |
不过,请记住 Laravel Excel还有更多功能。