Laravel Excel导入是否有限制行数功能?如何设置仅导入前n行数据?
解决方案
首先明确:WithLimit接口本身就是用于限制导入的数据行数,不是限制列数,你之前出现字段为null的报错,通常是两个原因:
- 未正确理解
limit()方法返回值的计算规则:该返回值是表头行之后要读取的数据行数,不包含你设置的第6行表头 - 读取到的后续行本身为空,没有对应表头的字段值
下面提供两种可行的实现方案:
方案1:正确使用WithLimit接口
这是官方推荐的最简方案,修改你的导入类即可:
- 首先引入
WithLimit接口 - 实现
limit()方法,返回你需要的前n行数据数量(从第7行开始计数,即表头后的第1行算第1条)
<?php namespace App\Imports; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; use Maatwebsite\Excel\Concerns\WithLimit; // 新增引入 use App\Models\FinancialTran; class FinancialTrans implements ToModel, WithHeadingRow, WithLimit // 新增实现接口 { /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { // 可选:加空行判断,避免空行导致字段为null报错 if (empty($row['sr']) || empty($row['date'])) { return null; } return new FinancialTran([ 'module_id' =>$row['sr'], 'tran_id'=>$row['sr'], 'amount'=>$row['sr'], 'crdr'=>$row['sr'], 'tran_date'=>$row['date'], 'acad_year'=>$row['academic_year'], 'entry_mode'=>$row['sr'], 'voucher_number'=>$row['voucher_no'], 'br_id'=>$row['sr'], ]); } public function headingRow(): int { return 6; } // 新增limit方法,比如要取表头后前10行就返回10 public function limit(): int { return 10; } }
控制器代码无需修改。
方案2:手动计数控制(灵活度更高)
如果需要动态传入限制行数、或者达到行数后直接终止读取节省性能,可以用该方案:
第一步:修改导入类
<?php namespace App\Imports; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; use Maatwebsite\Excel\Exceptions\StopExecutionException; // 引入终止异常 use App\Models\FinancialTran; class FinancialTrans implements ToModel, WithHeadingRow { private $maxRows; // 允许导入的最大行数 private $currentCount = 0; // 当前处理的行数计数 // 构造方法接收传入的限制行数 public function __construct(int $maxRows) { $this->maxRows = $maxRows; } /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { // 达到行数上限直接终止导入 if ($this->currentCount >= $this->maxRows) { throw new StopExecutionException(); } $this->currentCount++; return new FinancialTran([ 'module_id' =>$row['sr'], 'tran_id'=>$row['sr'], 'amount'=>$row['sr'], 'crdr'=>$row['sr'], 'tran_date'=>$row['date'], 'acad_year'=>$row['academic_year'], 'entry_mode'=>$row['sr'], 'voucher_number'=>$row['voucher_no'], 'br_id'=>$row['sr'], ]); } public function headingRow(): int { return 6; } }
第二步:修改控制器调用代码
传入你需要限制的行数即可,比如需要导入表头后前20行:
class FinancialTransController extends Controller { public function store(Request $request) { Excel::import(new FinancialTrans(20), request()->file('myfile')); return 'success'; } }
内容的提问来源于stack exchange,提问作者AJITHKUMAR S
相关产品推荐
相关产品推荐

