讨论数量:
推荐一下个人写的Excel处理工具 dcat/easy-excel,目前已在公司内项目中使用。
这个工具的特点是简单实用,导出大量数据仅需占用极小的内存(不论多大的数据一般只占用20M左右内存),支持分批读取数据并导出等多种实用功能。
安装
composer require dcat/easy-excel
分批读取数据并导出
chunkById
use Dcat\EasyExcel\Excel;
use App\User;
$lastId = 0;
$titles = ['id' => 'ID', 'name' => '名称', ...];
Excel::export()
->headings($titles) // 设置标题
->chunk(function () use (&$lastId) {
// 每次获取1000条数据导入
$chunkSize = 1000;
// 这里使用forPageAfterId批量读取数据,也可以用forPage
$collection = User::query()->forPageAfterId($chunkSize, $lastId)->get();
// 暂存最后一个ID
$lastId = $collection->last()->id;
// 当数据库查不到值时会停止执行闭包内的逻辑
return $collection;
})
->download('users.xlsx');
更多用法请参考文档。
推荐一下个人写的Excel处理工具 dcat/easy-excel,目前已在公司内项目中使用。
这个工具的特点是简单实用,导出大量数据仅需占用极小的内存(不论多大的数据一般只占用20M左右内存),支持分批读取数据并导出等多种实用功能。
安装
composer require dcat/easy-excel
分批读取数据并导出
chunkById
use Dcat\EasyExcel\Excel;
use App\User;
$lastId = 0;
$titles = ['id' => 'ID', 'name' => '名称', ...];
Excel::export()
->headings($titles) // 设置标题
->chunk(function () use (&$lastId) {
// 每次获取1000条数据导入
$chunkSize = 1000;
// 这里使用forPageAfterId批量读取数据,也可以用forPage
$collection = User::query()->forPageAfterId($chunkSize, $lastId)->get();
// 暂存最后一个ID
$lastId = $collection->last()->id;
// 当数据库查不到值时会停止执行闭包内的逻辑
return $collection;
})
->download('users.xlsx');
更多用法请参考文档。
我之前也遇到类似问题,那时候数据量有100万+,而且还要连表查,很麻烦。
可以开启缓冲,导出时,在缓冲区进行分段导,比如一次只导出1万,边导边写入
#简单示例
set_time_limit(1200);
ini_set('memory_limit', '1024M');
//设置文件头
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="文件名.csv"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$columns = ['列1名','列2名','列3名']; //定义好表头名称
$fp = fopen('php://output', 'a');//打开output流
mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($fp, $columns);
#在这里分段写入数据
for(……){
$data = xxx;//假设此段计算好的数据是$data;
foreach($data as $key => $rowData) {
fputcsv($fp, $rowData);
}
unset($data);
//刷新缓冲
ob_flush();
flush();
}
fclose($fp);
exit();
https://github.com/viest/php-ext-xlswriter
xlswriter是一个 PHP C 扩展,可用于在 Excel 2007+ XLSX 文件中读取数据,插入多个工作表,写入文本、数字、公式、日期、图表、图片和超链接。
导出
两种内存模式导出100万行数据(单行27列,数据类型均为字符串,单个字符串长度为19)
- 普通模式:耗时 29S,内存只需 2083MB;
- 固定内存模式:仅需 52S,内存仅需 <1MB;
导入
100万行数据(单行1列,数据类型为INT)
- 全量模式:耗时 3S,内存仅 558MB;
- 游标模式:耗时 2.8S,内存仅 <1MB;
推荐文章: