[Laravel] Laravel-Excel(Ver3.x)でCSVが文字化けするのは設定が間違っているからでした

結論

  • 作成した HogeExport クラスに getCsvSettings() で CSV の設定を用意しておく。
  • 忘れずに WithCustomCsvSettings を implement する。

2つ目を忘れてると、getCsvSettings() 用意しておいても無視されて気づかないのです…。

詳細

Excelで csv ファイルを開いたときに文字化けする現象ですが、

  • csvファイルの文字コードがUTF8でも、Excelは読み込める
  • ただし、BOM付きで!

っていうのは知っていたんですよねー。

php artisan make:export HogeExport --model=App\Model\Hoge

で作成したエクスポートクラスに getCsvSettings() を用意してやると、そのクラス固有の設定を指定できます。

が、このメソッド内で 'use_bom’ => true にしても相変わらず文字化けしたまま…。

Laravel-Excel のコアファイル追っかけたら、 vendor\maatwebsite\excel\src\Factories\WriterFactory.php の make() 内で

if ($export instanceof WithCustomCsvSettings) {
    static::applyCsvSettings($export->getCsvSettings());
}

なんていう処理がありまして、 implements WithCustomCsvSettings していないとデフォルト設定が反映されてしまい、use_bom の設定が効いていませんでしたとさ…。