Laravel excel 在导入前获取总行数

Kai*_*all 8 php laravel laravel-excel

直截了当的问题。如何使用 laravel-excel 获取电子表格中的总行数?

我现在有一个工作计数器,用于记录已处理的行数(在文件中CompanyImport),但在开始将行添加到数据库之前我需要总行数。

我正在导入的工作表几乎有 100 万行,因此我尝试创建一个进度条。

我的进口:

public function model(array $row)
{
    # Counter
    ++$this->currentRow;

    # Dont create or validate on empty rows
    # Bad workaround
    # TODO: better solution
    if (!array_filter($row)) {
        return null;
    }

    # Create company
    $company = new Company;
    $company->crn = $row['crn'];
    $company->name = $row['name'];
    $company->email = $row['email'];
    $company->phone = $row['phone'];
    $company->website = (!empty($row['website'])) ? Helper::addScheme($row['website']) : '';
    $company->save();

    # Everything empty.. delete address
    if (!empty($row['country']) || !empty($row['state']) || !empty($row['postal']) || !empty($row['address']) || !empty($row['zip'])) {

        # Create address
        $address = new CompanyAddress;
        $address->company_id = $company->id;
        $address->country = $row['country'];
        $address->state = $row['state'];
        $address->postal = $row['postal'];
        $address->address = $row['address'];
        $address->zip = $row['zip'];
        $address->save();

        # Attach
        $company->addresses()->save($address);

    }

    # Update session counter
    Session::put('importCurrentRow', $this->currentRow);

    return $company;

}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

public function postImport(Import $request)
{
    # Import
    $import = new CompaniesImport;

    # Todo
    # Total number of rows in the sheet to session
    Session::put('importTotalRows');

    #
    Excel::import($import, $request->file('file')->getPathname());

    return response()->json([
        'success' => true
    ]);
}
Run Code Online (Sandbox Code Playgroud)

小智 12

WithEvents在 Laravel Excel 3.1 中,您可以通过实现和监听事件来获取总行数beforeImport

<?php
namespace App\Imports;

use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeImport;

class UserImport extends ToModel, WithEvents {
    [...]

    public function registerEvents(): array
    {
        return [
            BeforeImport::class => function (BeforeImport $event) {
                $totalRows = $event->getReader()->getTotalRows();

                if (!empty($totalRows)) {
                    echo $totalRows['Worksheet'];
                }
            }
        ];
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

工作表可能会有所不同,具体取决于您的 Excel 文件工作表名称。一个用户可能将其命名为Sheet1,而另一个用户可能将其命名为Worksheet
因此,如果您确定用户将上传只有一张表的文件,您可以通过从数组的第一个元素获取总行数来避免问题,如下所示:

$totalRowCount = reset($totalRows);
Run Code Online (Sandbox Code Playgroud)


asc*_*ftw 5

您可以使用下面的代码来计算行数

Excel::import($import, 'users.xlsx');

dd('Row count: ' . $import->getRowCount()); 

Run Code Online (Sandbox Code Playgroud)

你可以查看文档

更新

上述方法用于计算到目前为止已导入的行数。为了获取工作表中的行数,您需要使用getHighestRow

    Excel::load($file, function($reader) {
        $lastrow = $reader->getActiveSheet()->getHighestRow();
        dd($lastrow);
    });
Run Code Online (Sandbox Code Playgroud)

插件作者已在此处引用了这一点。