您当前的位置: 首页  >  博文日记

dcat admin使用队列导出超大excel表

作者:总管理员 时间:2023-03-08 06:29:30 阅读数:830人阅读

在 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

标签: laravel

需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!