导出数据到Excel的正确方法是什么?

问题描述 投票:0回答:1

嗨,我正在使用

maatwebsite/excel:^3.1
包导出数据并将数据导出到 Excel,但出现
a 60 seconds exceeded 
错误。

这是我的

export.php
代码

namespace App\Exports;

use App\Models\Produit;
use Illuminate\View\View;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;

class ProductDataExport implements FromView, ShouldAutoSize
{
    use Exportable;

    private $products;
    public function __construct() {
        $this->products = Produit::all();
    }

    public function view() : View
    {
        return view('invoices-product',[
            'products_list' => Produit::all()
        ]);
    }
}

这是我的

Produitcontroller
文件:

public function exportProduct()
    {
        $product_list = Produit::all();
        return Excel::download(new ProductDataExport, 'products-data.xlsx');

    }

这是路线代码:

Route::post('products/export-excel',[ProduitController::class, 'exportProduct'])->name('products.download-excel');

这是我的表单操作:

<form action="{{ route('products.download-excel') }}" method="POST">
       @csrf
        <div>
              <button type="submit" class="btn btn-success">
                 <div>Export Excel</div>
              </button>
        </div>
</form>

老实说,我没有尝试过任何事情,因为我不知道我做错了什么?

excel laravel export
1个回答
0
投票

您遇到的 60 秒超时问题可能是由于获取和处理导出数据所需的时间造成的,尤其是在您拥有大型数据集的情况下。 Laravel Excel 包有时会面临大型数据集的性能问题。

以下是解决此问题的一些方法:

对数据进行分块:您可以对数据进行分块以分批处理,而不是使用 Produit::all() 一次获取所有记录。这可以减少内存使用和处理时间。具体方法如下:

public function __construct()
{
    $this->products = Produit::chunk(100, function ($products) {
        $this->products = $products;
    });
}

在此示例中,chunk(100) 将批量获取 100 条记录。

将导出作业排队:如果导出操作花费的时间太长,您可以将其卸载到队列中。 Laravel 提供了一个强大的队列系统来异步处理耗时的任务。您可以将导出作业分派到队列以避免超时。您可以这样做: 首先,确保您已正确配置队列系统(例如,使用 Redis、数据库等)。

然后,修改您的导出函数以分派作业:

use App\Exports\ProductDataExport;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Excel;
use App\Http\Controllers\Controller;

class ProduitController extends Controller
{
    public function exportProduct(Request $request)
    {
        $product_list = Produit::all();
        dispatch(new ProductDataExport($product_list));
        return redirect()->back()->with('success', 'Exporting products to Excel. You will be notified once the export is complete.');
    }
}

修改您的出口类别以接受产品列表:

use App\Models\Produit;
use Illuminate\View\View;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\Exportable;

class ProductDataExport implements FromView, ShouldAutoSize
{
    use Exportable;

    private $products;

    public function __construct($products)
    {
        $this->products = $products;
    }

    public function view(): View
    {
        return view('invoices-product', [
            'products_list' => $this->products
        ]);
    }
}

优化数据库查询:确保您的数据库查询得到优化。必要时使用索引,并避免不必要的联接或可能减慢数据检索速度的复杂查询。 尝试这些方法,看看它们是否有助于解决超时问题。

© www.soinside.com 2019 - 2024. All rights reserved.