| この記事の要点 |
|
エラー内容
Laravel で Excel / CSV ファイルを読み込もうとすると、ログ(storage/logs/laravel.log)に次のエラーが出ます。
local.ERROR: Call to undefined method Maatwebsite\Excel\Excel::load()
「Maatwebsite\Excel\Excel クラスに load() というメソッドは存在しない」という意味です。
原因: パッケージのバージョンと API の不一致
Laravel Excel は 2018 年の 3.0 で設計が大きく変わり、2.x 系で使われていた次のメソッドが削除されました。
Excel::load()… ファイルの読み込みExcel::create()… ファイルの作成・出力Excel::selectSheets()などのリーダー操作系
3.0 の時点では読み込み(インポート)機能自体が未提供で、インポートは 3.1(2018 年秋)で新しい API として復活しました。現在 composer require maatwebsite/excel を実行すると 3.1 系が入るため、ネット上に多い 2.x 時代のサンプル(Excel::load($path, function ($reader) { ... }))をそのまま使うと、このエラーになります。
まず、インストールされているバージョンを確認しましょう。
composer show maatwebsite/excel
versions : * 3.1.x のように表示されれば 3.1 系です。
対処法 1: 3.1 の API に書き換える(推奨)
旧コード(2.x)
Excel::load($path, function ($reader) {
$rows = $reader->get();
foreach ($rows as $row) {
// $row->name などで列にアクセス
}
});
新コード(3.1): 配列やコレクションとして読むだけの場合
中身を取り出して自分で処理したいだけなら、Import クラスを最小限で作り toArray() または toCollection() を使うのが一番簡単です。
php artisan make:import UsersImport
// app/Imports/UsersImport.php
namespace App\Imports;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class UsersImport implements WithHeadingRow
{
// 1 行目を見出しとして扱い、列名をキーにする
}
use App\Imports\UsersImport;
use Maatwebsite\Excel\Facades\Excel;
// シートごとの配列が返る。[0] が 1 枚目のシート
$sheets = Excel::toArray(new UsersImport, $request->file('file'));
foreach ($sheets[0] as $row) {
// $row['name'] のように見出し名でアクセス
}
新コード(3.1): そのまま DB に登録する場合
1 行を 1 モデルとして保存するなら ToModel を実装し、Excel::import() を呼びます。
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'],
]);
}
}
Excel::import(new UsersImport, $request->file('file'));
2.x と 3.1 の対応表
| やりたいこと | 2.x | 3.1 |
|---|---|---|
| 読み込んで配列で受け取る | Excel::load()->toArray() | Excel::toArray(new XxxImport, $file) |
| 読み込んでコレクションで受け取る | Excel::load()->get() | Excel::toCollection(new XxxImport, $file) |
| 読み込んで DB に保存 | コールバック内で自前処理 | ToModel を実装して Excel::import() |
| 1 行目を見出しにする | 設定ファイルの heading | WithHeadingRow を実装 |
| 特定シートだけ読む | selectSheets() | WithMultipleSheets を実装 |
| ファイルを作ってダウンロード | Excel::create()->download() | Export クラス+ Excel::download() |
対処法 2: 2.x にダウングレードする(古い Laravel のみ)
既存の大量のコードを書き換えられない場合、2.1 系に戻す方法もあります。
composer require "maatwebsite/excel:~2.1.0"
ただし 2.1 系は Laravel 5 系の時代のパッケージで、すでに保守されていません。Laravel 6 以降では依存関係の制約でインストールできないことが多く、PHP の新しいバージョンでも動作しません。新規開発や Laravel のアップグレードを予定しているプロジェクトでは選ばないでください。
落とし穴
- Facade の名前空間: 3.1 では
use Maatwebsite\Excel\Facades\Excel;を使います。エラーメッセージにあるMaatwebsite\Excel\Excelはその裏側の本体クラスです - 見出しのキー:
WithHeadingRowを使うと見出しはスラッグ化され、「User Name」はuser_nameのようなキーになります - CSV の文字コード: Excel で保存した Shift_JIS の CSV は文字化けします。設定ファイル(
config/excel.php)の CSV 入力エンコーディングを指定するか、UTF-8 で保存し直します - 大きなファイル: 数万行以上は
WithChunkReadingで分割読み込みしないとメモリ不足になりやすいです
確認方法
composer show maatwebsite/excelでバージョンが 3.1 系であることを確認- コード中に
Excel::loadやExcel::createが残っていないか全文検索する - 小さなテスト用ファイルで
Excel::toArray()を実行し、dd()で中身を表示して確認
詳しい使い方は公式ドキュメント(https://docs.laravel-excel.com/)の 3.1 のページを参照してください。
関連
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- PHP CSV 読み込み完全ガイド (fgetcsv/SplFileObject)
- Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- CSV(.csv)完全ガイド — RFC 4180・文字コード・Excel 罠
- Python openpyxl で Excel(xlsx) を読み書きする完全ガイド
子ページはありません
- Fatal error: Maximum execution time of 30 seconds exceeded in...
- Fatal error: Uncaught Error: Cannot use object of type stdClass as array in ...
- Warning: Use of undefined constant ... - assumed '...' (this will throw an Error)
- ERROR: Call to undefined method Maatwebsite\Excel\Excel::load()
- Maximum execution time of 30 seconds exceeded
- Your requirements could not be resolved to an installable set of packages. ... To enable extensions, verify that they are enabled in your .ini files:
- could not find driver
- the requested PHP extension mbstring is missing from your system.
- the requested PHP extension dom is missing from your system.
- A non well formed numeric value encountered
- Warning: Cannot modify header information - headers already sent by ...
- php_network_getaddresses: getaddrinfo failed: Name or service not known
- XMLWriter::openUri(): Unable to resolve file path
- Object of class stdClass could not be converted to string
- Class 'Google_Service_Youtube' not found
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38