Laravel报错:调用未定义方法Maatwebsite\Excel\Excel::load()求解决
问题
运行Excel导入脚本时出现报错:Call to undefined method Maatwebsite\Excel\Excel::load(),尝试替换为Excel::import()后问题仍未解决,相关代码如下:
public function postImport(Request $request) { // $this->validate($request, [ // 'file' => 'required|mimes:xls,xlsx' // ]); $path = $request->file('file')->getRealPath(); $data = Excel::load($path)->get(); // $data = Excel::toArray([],$path); if($data->count() > 0) { foreach($data->toArray() as $key => $value) { foreach($value as $row) { $insert_data[] = array( 'nomorUrut' => $row[0], 'namaSupplier' => $row[1], 'singkatanSupplier' => $row[2], 'tipeSupplier' => $row[3], 'alamatSupplier' => $row[4], 'kodePosSupplier' => $row[5], 'noTelpSupplier' => $row[6], 'noFax' => $row[7], 'emailSupplier' => $row[8], 'contakSupplier' => $row[9], 'hp' => $row[10], ); } } if(!empty($insert_data)) { DB::table('uplSupplier')->insert($insert_data); } } return back()->with('success', 'Excel Data Imported successfully.'); // }
解决方案
这个报错的核心原因是Maatwebsite/Laravel-Excel版本差异:load()是2.x版本的专属方法,3.x及以上版本已完全移除该方法,直接替换成import()无效是因为二者用法逻辑完全不同。针对你的需求,提供两种可直接复用的修改方案:
方案一:直接用toArray()读取(快速适配现有代码)
3.x+版本支持通过Excel::toArray()直接读取文件内容,修改后的控制器代码如下:
public function postImport(Request $request) { // 建议开启验证,避免无效文件上传 $this->validate($request, [ 'file' => 'required|mimes:xls,xlsx' ]); $path = $request->file('file')->getRealPath(); // 使用toArray读取,第一个参数传空数组即可 $data = Excel::toArray([], $path); $insert_data = []; // toArray返回二维数组,外层是工作表集合,$data[0]代表第一个工作表的行数据 foreach($data[0] as $row) { $insert_data[] = [ 'nomorUrut' => $row[0], 'namaSupplier' => $row[1], 'singkatanSupplier' => $row[2], 'tipeSupplier' => $row[3], 'alamatSupplier' => $row[4], 'kodePosSupplier' => $row[5], 'noTelpSupplier' => $row[6], 'noFax' => $row[7], 'emailSupplier' => $row[8], 'contakSupplier' => $row[9], 'hp' => $row[10], ]; } if(!empty($insert_data)) { DB::table('uplSupplier')->insert($insert_data); } return back()->with('success', 'Excel数据导入成功。'); }
方案二:使用官方推荐的导入类(适合复杂场景)
如果后续需要添加数据验证、批量处理、错误捕获等功能,建议使用官方标准的导入类方案:
- 生成导入类文件
php artisan make:import SupplierImport
- 修改
app/Imports/SupplierImport.php内容:
namespace App\Imports; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\ToCollection; use Illuminate\Support\Collection; class SupplierImport implements ToCollection { public function collection(Collection $rows) { $insert_data = []; foreach ($rows as $row) { $insert_data[] = [ 'nomorUrut' => $row[0], 'namaSupplier' => $row[1], 'singkatanSupplier' => $row[2], 'tipeSupplier' => $row[3], 'alamatSupplier' => $row[4], 'kodePosSupplier' => $row[5], 'noTelpSupplier' => $row[6], 'noFax' => $row[7], 'emailSupplier' => $row[8], 'contakSupplier' => $row[9], 'hp' => $row[10], ]; } if(!empty($insert_data)){ DB::table('uplSupplier')->insert($insert_data); } } }
- 更新控制器方法:
use App\Imports\SupplierImport; use Maatwebsite\Excel\Facades\Excel; public function postImport(Request $request) { $this->validate($request, [ 'file' => 'required|mimes:xls,xlsx' ]); Excel::import(new SupplierImport, $request->file('file')); return back()->with('success', 'Excel数据导入成功。'); }
内容的提问来源于stack exchange,提问作者Billie
相关产品推荐
相关产品推荐

