Có thể bạn quan tâm: Bảng Thanh Toán Tiền Thuê Ngoài File Excel: Cách Quản Lý Hiệu Quả Và Tối Ưu Hóa Công Việc
1. Giới thiệu
Trong quá trình phát triển ứng dụng web với Laravel, việc thao tác nhập xuất dữ liệu từ file Excel là một nhu cầu phổ biến. Thư viện maatwebsite/excel (được tích hợp trong Laravel thông qua Package Laravel Excel) đã trở thành công cụ chuẩn để thực hiện các thao tác này. Tuy nhiên, khi cập nhật phiên bản mới hoặc khi cấu hình sai, có thể gặp lỗi “Call to undefined method maatwebsite excel excel load”. Lỗi này thường xuất hiện khi bạn cố gắng gọi phương thức load() trên một đối tượng không tồn tại phương thức đó.
Trong bài viết này, chúng ta sẽ phân tích nguyên nhân gây ra lỗi, cách khắc phục chi tiết, các bước kiểm tra, cách cập nhật đúng phiên bản, cách thay thế nếu cần, và những mẹo bảo trì mã nguồn để tránh lỗi này trong tương lai. Bài viết sẽ dài hơn 1500 từ, bao gồm cả ví dụ mã, hướng dẫn từng bước và một số lưu ý thực tế.
Có thể bạn quan tâm: Bảng Excel Thu Chi Nội Bộ Công Ty: Tối Ưu Hóa Quản Lý Tài Chính Cho Doanh Nghiệp
2. Nguồn gốc của lỗi
2.1 Lịch sử phát triển của Laravel Excel
- Phiên bản 2.x (cũng là phiên bản 3.x trong một số trường hợp) hỗ trợ phương thức
load()để đọc file Excel. - Phiên bản 3.x (Laravel Excel 3.1+), bắt đầu từ dự án Laravel Excel 3.1, đã loại bỏ
load()và thay thế bằngimport()vàtoCollection(). Điều này nhằm cải thiện tính năng và tối ưu hiệu suất. - Phiên bản 4.x (Laravel Excel 4.0) tiếp tục bảo trì phương thức
import(),export(),load()đã bị loại bỏ hoàn toàn.
Do đó, khi bạn đang sử dụng Laravel Excel 4.x nhưng vẫn gọi load() mais, PHP sẽ báo lỗi vì phương thức không tồn tại trong lớp Excel.
2.2 Các trường hợp gây ra lỗi
- Cập nhật package màaisy chưa cập nhật code: Bạn đã chạy
composer update maatwebsite/excelvà nhận được phiên bản mới, nhưng trong file controller vẫn còn gọiExcel::load(). - Sai alias hoặc namespace: Bạn đang sử dụng alias
Excelnhưng trongconfig/app.phpalias chưa được cập nhật đúng hoặc đã bị xóa. - Sử dụng cài đặt cũ trong Docker hoặc môi trường CI: Có thể có cache hoặc cài đặt cũ trong Dockerfile, dẫn đến phiên bản không đồng nhất.
- Sử dụng phiên bản Laravel không tương thích: Laravel 8+ yêu cầu Laravel Excel 3.x trở lên, nhưng bạn đang cố gắng chạy
load()trên phiên bản 4.x.
Có thể bạn quan tâm: Bảng Chi Tiết Mua Xe Gắn Máy Excel: Hướng Dẫn Thực Tế Từ A Tới Z
3. Kiểm tra môi trường hiện tại
Trước khi bắt đầu sửa lỗi, hãy xác định chính xác phiên bản của các package đang được cài đặt.
composer show maatwebsite/excel
Kết quả sẽ giống như:
name : maatwebsite/excel
version : 4.1.1
...
Nếu bạn thấy phiên bản 4.x hoặc 3.x, hãy ghi lại.
3.1 Kiểm tra alias
// config/app.php
'aliases' => ... 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ...
,
Nếu alias bị thiếu, PHP sẽ không tìm thấy Excel::load() và báo lỗi “undefined method” vì Excel không phải là một class.
3.2 Kiểm tra autoload
Chạy:
composer dump-autoload
Đảm bảo autoload được cập nhật.
4. Cách khắc phục
4.1 Sử dụng phương thức phù hợp với phiên bản
4.1.1 Phiên bản 4.x (Laravel Excel 4.1+)
Trong phiên bản này, thay vì Excel::load talleres, ta dùng:
Excel::import(new YourImport, $file);
Cách sử dụng:
use App\Imports\UsersImport;
use Maatwebsite\Excel\Facades\Excel; public function import(Request $request)
{ $path = $request->file('import_file')->store('imports'); Excel::import(new UsersImport, storage_path('app/' . $path)); return back()->with('success', 'Import successful');
}
Lưu ý: UsersImport phải mở rộng Maatwebsite\Excel\Concerns\ToModel hoặc ToCollection.
4.1.2 Phiên bản 3.x (Laravel Excel 3.1)
Excel::import(new UsersImport, $file);
Bạn cũng có thể lấy dữ liệu dưới dạng collection:
$collection = Excel::toCollection(new UsersImport, $file);
4.1.3 Phiên bản 2.x hoặc 1.x
Nếu bạn vẫn muốn dùng load(), bạn phải giữ phiên bản cũ:
composer require maatwebsite/excel:~2.0
Sau đó bạn có thể gọi:
Excel::load($file, function ($reader) { // xử lý dữ liệu
});
Nhưng do bảo mật và hỗ trợ, tốt nhất nên nâng cấp lên 3.x/4.x.
4.2 Cập nhật lại mã nguồn
Nếu bạn đang dùng Excel::load(), hãy thay đổi thành Excel::import().
Trong controller:
// Trước
Excel::load($file, function($reader){ ... }); // Sau
Excel::import(new YourImport, $file);
Nếu bạn chỉ cần dữ liệu, không cần xử lý từng dòng:
$collection = Excel::toCollection(new YourImport, $file);
4.3 Tạo Import class
Nếu bạn chưa có file import, tạo một class:
php artisan make:import UsersImport --model=User
Trong class:
namespace App\Imports; use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow; class UsersImport implements ToModel, WithHeadingRow
{ public function model(array $row) { return new User( 'name' => $row'name', 'email' => $row'email', // ... ); }
}
4.4 Xử lý lỗi khi file không hợp lệ
try { Excel::import(new UsersImport, $file);
} catch (\Maatwebsite\Excel\Validators\ValidationException $ex) { $failures = $ex->failures(); // Xử lý lỗi
}
llu
5. Kiểm tra lại dependencies
Đôi khi, vấn đề không chỉ là load() mà còn là version conflict.
5.1 Composer.json
"require": { "laravel/framework": "^10.0", "maatwebsite/excel": "^4.1"
}
5.2 Composer update
composer update maatwebsite/excel
5.3 Xóa cache
php artisan config:clear
php artisan cache:clear
6. Khi không thể thay đổi phiên bản
Nếu bạn vẫn muốn dùng load(), bạn có thể tạo một wrapper:
use Maatwebsite\Excel\Facades\Excel; class ExcelLoadWrapper
{ public static function load($file, callable $callback) { $excel = Excel::toCollection(null, $file); $callback($excel); }
}
Sau đó:
ExcelLoadWrapper::load($file, function ($reader) { // ...
});
Tuy nhiên, điều này chỉ là giải pháp tạm thời, vì bạn vẫn đang sử dụng phương thức cũ không được hỗ trợ.

Có thể bạn quan tâm: Cách Bỏ Dấu Cách Ở Đầu Dòng Trong Excel: Hướng Dẫn Chi Tiết
7. Thay thế bằng thư viện khác
Nếu bạn gặp khó khăn khi làm việc với Laravel Excel, một lựa chọn khác là PhpSpreadsheet.
composer require phpoffice/phpspreadsheet
Ví dụ:
use PhpOffice\PhpSpreadsheet\IOFactory; $spreadsheet = IOFactory::load($file);
$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getRowIterator() as $row) { // Xử lý dữ liệu
}
Tuy nhiên, phương pháp này tốn thời gian hơn khi tích hợp với Laravel và không có các hàm tiện ích như Excel::import().
8. Khi làm việc trong môi trường Docker/Kiểm tra CI
Để tránh lỗi “undefined method”, bạn nên:
- Xác định phiên bản trong Dockerfile:
RUN composer require maatwebsite/excel:"^4.1"
Sử dụng
composer.lock: Đừng bỏ qua file này trong repo. Khi CI chạy, nó sẽ cài đặt chính xác phiên bản.Kiểm tra: Thêm test unit để kiểm tra import:
public function testImport()
{ $this->artisan('import:users', 'path' => 'tests/fixtures/users.xlsx'); $this->assertDatabaseCount('users', 10);
}
Nếu test thất bại vì method không tồn tại, CI sẽ cảnh báo.
9. Các mẹo bảo trì và tối ưu
9.1 Luôn cập nhật package
- Dùng
composer outdatedđể xem package cũ. - Sử dụng
composer updatethường xuyên.
9.2 Kiểm tra alias
- Khi cập nhật package, hãy double-check alias trong
config/app.php.
9.3 Sử dụng Import class
- Việc tạo import class giúp code sạch và dễ bảo trì.
9.4 Đặt php artisan cache:clear
- Khi thay đổi config hay alias, chạy lệnh này để tránh cache lỗi.
9.5 Định nghĩa custom exception
- Khi import thất bại, ném custom exception để ghi log.
public function import(Request $ arrêter) { try { Excel::import(new UsersImport, $file); } catch (\Exception $e) { Log::error('Excel import failed: ' . $e->getMessage()); return back()->with('error', 'Import failed.'); }
}
10. Ví dụ toàn diện
Dưới đây là một ví dụ hoàn chỉnh từ đầu tới cuối, bao gồm:
- Controller (
UserImportController) - Import class (
UsersImport) - Route
- View (form)
- Kiểm tra lỗi
10.1 Route
Route::post('/users/import', UserImportController::class, 'import') ->name('users.import');
10.2 Controller
namespace App\Http\Controllers; use App\Imports\UsersImport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\Log; class UserImportController extends Controller
{ public function import(Request $request) { $request->validate( 'file' => 'required|file|mimes:xlsx,xls', ); $file = $request->file('file'); try { Excel::import(new UsersImport, $file); therein.back(); } catch (\Exception $e) { Log::error('Excel import error: ' . $e->getMessage()); return back()->withErrors('file' => 'Import failed.'); } }
}
10.3 Import class
namespace App\Imports; use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow; class UsersImport implements ToModel, WithHeadingRow
{ public functionRt(array $row) { return new User( 'name' => $row'name', 'email' => $row'email', 'phone' => $row'phone', ); }
}
10.4 View (form)
<form action="{{ route('users.import') }}" method="POST" enctype="multipart/form-data"> @csrf <input type="file" name="file" required> <button type="submit">Import</button>
</form>
10.5 Kiểm tra lỗi
Nếu bạn chạy ứng dụng và nhập file, nếu file hợp lệ, dữ liệu sẽ được import vào bảng users. Nếu có lỗi, bạn sẽ nhận được thông báo và log sẽ ghi lại chi tiết.
11. Kết luận
Lỗi “Call to undefined method maatwebsite excel excel load” thường xuất hiện khi bạn đang sử dụng phương thức load() nhưng 있다는 Laravel Excel đã loại bỏ phương thức này trong các phiên bản mới. Để khắc phục:
- Xác định phiên bản Laravel Excel hiện tại (
composer show maatwebsite/excel). - Sử dụng phương thức phù hợp (
Excel::import(),Excel::toCollection(), …). - Kiểm tra alias, autoload, và cache.
- Nếu cần, tạo Import class và cấu hình đúng.
- Nếu muốn dùng
load(), cần giữ phiên bản cũ (không được khuyên). - Kiểm tra môi trường Docker, CI, và đồng nhất phiên bản qua
composer.lock.
Bằng cách tuân thủ các bước trên, bạn sẽ khắc phục được lỗi này một cách nhanh chóng, đồng thời duy trì mã nguồn ổn định và dễ bảo trì trong tương lai.

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
