Laravel队列导出Excel生成空文件问题求助
问题:Laravel队列执行Excel导出仅生成空文件
已配置带Horizon的Laravel队列,整体运行正常,但执行Excel导出时,Horizon显示任务完成,缓存文件夹却只生成6KB的空Excel文件。
相关代码与日志
app/exports/FullReportExport.php
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithChunkReading; use Illuminate\Contracts\Queue\ShouldQueue; use App\Models\Admin\FullReport; class FullReportExport implements FromQuery, WithChunkReading, ShouldQueue { use Exportable; public function query() { return FullReport::query(); } public function chunkSize(): int { return 5000; } }
app/Http/Controllers/Admin/Reports/FullReportController.php
<?php namespace App\Http\Controllers\Admin\Reports; use App\Http\Controllers\Controller; use App\Exports\FullReportExport; class FullReportController extends Controller { public function __construct() { $this->middleware('auth'); } public function export() { (new FullReportExport)->store('invoices.xlsx'); } }
worker.log
[2023-09-20 04:05:10][10] Processing: Maatwebsite\Excel\Jobs\QueueExport [2023-09-20 04:05:10][10] Processed: Maatwebsite\Excel\Jobs\QueueExport
laravel-worker.ini
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=/Applications/MAMP/bin/php/php7.4.33/bin/php /Users/cairocoder/Sites/localhost/myapp/artisan queue:work redis --timeout=3600 autostart=true autorestart=true user=cairocoder numprocs=8 redirect_stderr=true stdout_logfile=/Users/cairocoder/Sites/localhost/myapp/storage/logs/worker.log
解决方法
1. 确认数据源是否有数据
先排查FullReport模型是否有可导出的数据,在控制器临时添加调试代码:
public function export() { dd(FullReport::count()); // 输出数据总量 (new FullReportExport)->store('invoices.xlsx'); }
如果返回0,空文件属于正常情况,需要检查数据生成逻辑。
2. 补全WithHeadings接口的实现
你的导出类声明了WithHeadings接口,但未实现headings()方法,这会导致Excel无法正确渲染内容。添加表头方法:
public function headings(): array { // 替换为你的模型实际字段 return [ 'ID', '创建时间', '状态', // ...其他需要导出的字段 ]; }
3. 检查模型字段可见性
如果FullReport模型设置了$hidden或$visible属性,可能导致导出时字段被隐藏。打开模型文件,确保需要导出的字段未被加入$hidden数组,或者在$visible中包含这些字段。
4. 验证目录权限
确保队列worker进程拥有storage/app目录的读写权限,权限不足可能导致数据无法写入文件。执行以下命令调整权限:
chmod -R 755 storage/app
5. 开启Excel调试日志
在config/excel.php中开启调试模式,查看导出过程中的具体错误:
'debug' => true,
调试日志会输出到storage/logs/laravel.log,从中可以定位导出失败的具体原因。
内容的提问来源于stack exchange,提问作者CairoCoder
相关产品推荐
相关产品推荐

