Laravel 5.8使用maatwebsite/excel 3导入Excel参数不足错误解决
解决Maatwebsite Excel 3.x中
Excel::import()参数不足的错误 你遇到的这个错误核心原因是Maatwebsite Excel 3.x的API和旧版本(比如2.x)有本质区别,Excel::import()方法要求至少传入两个参数:第一个是自定义的导入类(Importer Class),第二个才是文件路径/文件实例。你现在只传了文件路径,所以触发了参数不足的报错。
下面是一步步的解决方案:
1. 创建自定义导入类
首先用Laravel Artisan命令生成一个导入类,这个类会专门负责处理Excel数据的读取和数据库插入逻辑:
php artisan make:import CustomerImport
生成的文件会存放在app/Imports/CustomerImport.php,打开它并修改为以下内容:
<?php namespace App\Imports; use App\Models\Customer; // 请确保你的模型与tbl_customer表对应,可在模型中设置protected $table = 'tbl_customer'; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; // 如果你的Excel第一行是表头,启用这个接口 class CustomerImport implements ToModel, WithHeadingRow { /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { return new Customer([ 'CustomerName' => $row['customer_name'], 'Gender' => $row['gender'], 'Address' => $row['address'], 'City' => $row['city'], 'PostalCode' => $row['postal_code'], 'Country' => $row['country'], ]); } }
- 如果你的Excel没有表头(第一行就是数据),可以移除
WithHeadingRow接口,改用下标(比如$row[0])获取对应字段值。
2. 调整控制器的导入逻辑
你的ImportExcelController里的import方法需要完全重构,因为3.x版本不再通过get()直接获取数据,而是由导入类处理数据插入。修改后的代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; use App\Imports\CustomerImport; // 导入刚才创建的自定义导入类 class ImportExcelController extends Controller { public function import(Request $request){ $this->validate($request, [ 'select_file' => 'required|mimes:xls,xlsx' ]); $path = $request->file('select_file')->getRealPath(); // 调用import方法,传入导入类实例和文件路径 Excel::import(new CustomerImport, $path); return back()->with('success', 'Import data successfully!'); } }
额外修复:你代码里的两处小错误
- Blade文件中
class="form-controll"是拼写错误,应该改为class="form-control" - 控制器中
DB::table('tbl_customer')->inset($insert_data);是拼写错误,应该改为insert
为什么之前的代码无法运行?
在Maatwebsite Excel 2.x版本中,你可以直接用Excel::load($path)->get()获取数据,但3.x版本彻底重构了API,强制要求使用导入类封装数据处理逻辑,让代码更模块化、可维护,这是版本迭代后的核心变化。
按照上述步骤修改后,你的Excel导入功能就能正常工作,数据会通过自定义导入类自动插入到tbl_customer表中。
内容的提问来源于stack exchange,提问作者Rashed Jhony
相关产品推荐
相关产品推荐

