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)
您可以使用下面的代码来计算行数
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)
插件作者已在此处引用了这一点。
| 归档时间: |
|
| 查看次数: |
32045 次 |
| 最近记录: |