【问题标题】:Export large amount of data with Laravel Excel Export (version 3.1)使用 Laravel Excel 导出(3.1 版)导出大量数据
【发布时间】:2020-02-07 15:48:29
【问题描述】:

我正在尝试使用 Laravel Excel Export 3.1 版导出大量数据,但我总是内存不足(我的限制是 512M)。

在导出类中:

class ExcelExport implements FromQuery
{
    use Exportable;


    public function query()
    {
        return DB::table('myTable')->orderBy('date');
    }

}

在控制器中:

Excel::store(new ExcelExport(), 'myFile.xlsx');

从官方文档中我看到以下内容:

“通过使用 FromQuery 关注点,我们可以为导出准备一个查询。这个查询在后台分块执行。”

但它似乎没有按预期工作。

使用查询生成器有问题吗?

另外,有没有办法设置块大小?

我尝试在查询中使用限制子句,如下所示:

public function query()
{
    return DB::table('myTable')->orderBy('date')->limit(1000);
}

但不起作用:似乎没有使用限制。

我已经尝试在 try...catch 块中捕获错误:

try{
    Excel::store(new ExcelExport(), 'myFile.xlsx');
}
catch(\Exception $e){
    Log::error($e->getMessage());
}

但是,它仍然没有捕获任何异常:我看到的只是 500 内部服务器错误。

有人可以帮我吗?

非常感谢您。

【问题讨论】:

  • 您无法捕获内存异常 :) 您是否有任何文本或 blob 列类型,我会将它们排除在导出之外。一般来说,当我遇到这些情况时,我们增加了内存使用量。一个想法也可能是将其作为命令运行,因为通常 php cli 没有相同的内存限制。
  • 感谢您这么快回复。我没有 blob 数据,但是我无法控制数据量,所以我可以导出 1000 或 100000 条记录。当我阅读“在幕后,这个查询是分块执行的”时,我希望内存限制不再是问题,因为我希望查询是分块执行并附加到文件中的,但它似乎不起作用方法。我不敢相信 512M 的内存不足以管理数据块。有没有办法以某种方式知道/设置块大小?
  • 这是一篇关于使用 Laravel 将大量数据导出到 Excel 的文章:dev.to/rap2hpoutre/…

标签: excel laravel export


【解决方案1】:

您可以尝试隐式导出队列。

use Illuminate\Contracts\Queue\ShouldQueue;

class ExcelExport implements FromQuery, ShouldQueue
{
    use Exportable;

    public function query()
    {
        return DB::table('myTable')->orderBy('date');
    }

}

这样调用你的导出:

(new ExcelExport)->store('myFile.xlsx');

这样,多个作业将被链接起来,以便对进程进行分块。

docs 中了解更多信息。

【讨论】:

  • 感谢您的建议。现在发生了一些变化,但我还有另一个错误:“您无法序列化或反序列化 PDO 实例”。
  • 问题你不能序列化或反序列化 PDO 实例,因为特性 SerializesModels 你不能使用 DB 的特性
猜你喜欢
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2019-03-24
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多