dcat admin使用队列导出超大excel表
作者:总管理员
时间:2023-03-08 06:29:30
阅读数:792人阅读
在 Laravel 中导出超大 Excel 表可以使用 Laravel Excel 扩展,它使用了 Chunk 的方式避免内存溢出的问题,同时提供了 Laravel 内置的队列系统来处理大量数据的导出。
以下是使用 Laravel Excel 导出超大 Excel 表的步骤:
首先使用 Composer 安装 Laravel Excel:
composer require maatwebsite/excel
创建一个新的导出类,实现 FromQuery 或 FromCollection 接口:
use Maatwebsite\Excel\Concerns\FromQuery;
class UsersExport implements FromQuery
{
public function query()
{
return User::select('id', 'name', 'email');
}
}
在 Controller 中调用导出类并使用 chunkSize 方法设置每次读取的数据量(默认为 1000),并使用 store 方法保存导出文件:
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
class UserController extends Controller
{
public function export()
{
return Excel::store(new UsersExport, 'users.xlsx', 'local', \Maatwebsite\Excel\Excel::XLSX, [
'chunk_size' => 5000, // 设置每次读取 5000 条记录
]);
}
}
配置队列系统,将导出任务放入队列中执行,以避免占用 Web 服务器资源:
use App\Jobs\ExportUsersJob;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class UserController extends Controller
{
public function export(Request $request)
{
$fileName = 'users.xlsx';
$chunkSize = 5000;
$job = new ExportUsersJob($fileName, $chunkSize);
dispatch($job->onQueue('exports'));
return response()->json([
'message' => 'Export job started!',
]);
}
}
创建 ExportUsersJob 类,实现 ShouldQueue 接口,使用 chunkBy 方法将数据分块读取并导出:
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\QueuedWriter;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\SerializesModels;
class ExportUsersJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $fileName;
public $chunkSize;
public function __construct($fileName, $chunkSize)
{
$this->fileName = $fileName;
$this->chunkSize = $chunkSize;
}
public function handle()
{
$writer = new QueuedWriter(storage_path("exports/{$this->fileName}"));
Excel::store(new UsersExport, $writer, 'local', \Maatwebsite\Excel\Excel::XLSX, [
'chunk_size' => $this->chunkSize,
'temp_memory' => '256MB', // 设置临时内存大小
]);
$writer->close();
}
}
其中,temp_memory 参数可以设置临时内存大小,以确保在进行大数据导出时不会因为内存不够而导致执行失败。
这样就可以使用 Laravel Excel 扩展导出超大 Excel 表了。
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱: 2554509967@qq.com
上一篇:机关单位个人剖析材料
下一篇:php通用工资查询系统使用教程