【问题标题】:Laravel Excel 3.1 export large dataLaravel Excel 3.1 导出大数据
【发布时间】:2019-09-21 03:02:59
【问题描述】:

我需要使用 Maatwebsite Laravel excel 3.1 插件将超过 10 万条记录从数据库导出到 Excel,问题是我将数据作为数组获取。

$data = $this->client->getData("sc/asistencia-social/informe",$request->all());

 return (new ExcelExport($data))->store('myFile.xlsx'); //using FromQuery

我的 ExcelExport 类:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\SerializesModels;

class ExcelExport implements FromQuery
{
 use Exportable, SerializesModels;
 private $data;

public function __construct($data)
{   
   $this->data = $data;     //Inject data 
}

public function query()
{   
   return $this->data;  
}
}

实际上,我收到“调用数组上的成员函数 chunk()”错误。 我什至试图将其转换为一个集合,但没有成功。有没有办法解决这个问题。

【问题讨论】:

    标签: laravel laravel-excel


    【解决方案1】:

    您已将导出类创建为FromQuery 导出类。而是创建一个FromArray 导出类。

    注意实现接口和函数名称

    class ExcelExport implements FromArray // this was FromQuery before
    {
        use Exportable, SerializesModels;
    
        private $data;
    
        public function __construct($data)
        {   
            $this->data = $data;     //Inject data 
        }
    
        public function array(): array // this was query() before
        {   
            return $this->data;  
        }
    }
    

    【讨论】:

    • 我对其进行了测试并获得了“App\Exports\ExcelExport::array() 的声明必须与 Maatwebsite\Excel\Concerns\FromArray::array(): 数组兼容”
    • 我认为是因为缺少array()函数的返回类型,更新了答案
    • 它仍在运行,导出大约 30k 条记录需要 4 分钟以上,我阅读了 FromQuery 利用块,有人说只在导入时没有导出。是这样吗?
    • 不,你可以也使用 FromQuery 来导出,而且它也比这种方法更好。但是如果你想这样做,你不想通过构造函数传递数据。您需要在query() 函数中编写数据库查询。如果数据库中有很多数据,我认为这是最好的解决方案。
    • 不可能。如果你想使用FromQuery 方法,你必须为query() 函数提供一个sql 查询。然后他们将负责从数据库中获取数据(那里是他们应用块的地方)。否则不能使用FromQuery 方法。
    【解决方案2】:

    成功了

    在查询中删除 ->get() 或替换为 ->paginate(100)

    使用 maatwebsite 队列导出。

    【讨论】:

      【解决方案3】:

      您应该使用shouldQueue 将大数据导出到 Excel 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        • 2016-06-30
        • 2019-08-08
        • 1970-01-01
        相关资源
        最近更新 更多