You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:28:14