Laravel

Laravel ExcelのCSVエクスポートをShift-JIS形式でダウンロードさせる方法(Laravel 9)

※本ページはアフィリエイトプログラムによる収益を得ています

Laravel ExcelでエクセルファイルやCSVファイルのアップロードやダウンロードをさせる際に出くわすのが文字コードの問題です。

このLaravel Excelの文字コード問題の解決方法はいくつかの記事で紹介されておりますが、mb_convert_encodingを使って文字コードを変換する方法もしくは、BOM付きのデータにする、というどちらかの記事がほとんどでした。ですがその方法ではなく、それよりももっと簡単かつ私が使っているLaravel9のバージョンでの正攻法のやり方があったので紹介します。

Laravel9の場合、ルートにconfigフォルダがあり、Laravel Excelをインストールしていた場合にはその中にexcel.phpという設定ファイルが入っているのが確認できます。そのファイルを開くと頭の書き出しはこんな記述からスタートしているはずです。

<?php

use Maatwebsite\Excel\Excel;

return [
    'exports' => [

さらに下の方にスクロールして以下の記述を見つけてください。

'csv'                    => [
            'delimiter'              => ',',
            'enclosure'              => '"',
            'line_ending'            => PHP_EOL,
            'use_bom'                => false,
            'include_separator_line' => false,
            'excel_compatibility'    => false,
						'output_encoding'        => '',
        ],

csvと書かれている箇所です。
これは間違いなくCSV書き出しのための設定がありそうな気配。

この中のoutput_encodingの値に文字コード指定を入れればOK、たったそれだけです。ちなみにShift-JISの場合、SHIFT-JISと入れればいいのですが、私はSHIFT-JISの拡張版であるCP932(拡張版という言い方が正しいかわかりませんが)を設定しています。

'csv'                    => [
            'delimiter'              => ',',
            'enclosure'              => '"',
            'line_ending'            => PHP_EOL,
            'use_bom'                => false,
            'include_separator_line' => false,
            'excel_compatibility'    => false,
            'output_encoding'        => 'CP932',//拡張shift-jis
        ],

ダウンロードしたファイルの文字コードを調べるとShift-JISになっていました。

おまけ:インポートの文字コードも同じやり方でOK

エクスポートがこのやり方でできるのであればインポートも同様にできるはずです。インポート時の読み込みファイルがShift-JIS形式の場合は、同じくconfig/excel.phpファイルにて今度はimportsと記述されているところを探してください。

    'imports'            => [

        /*
        |--------------------------------------------------------------------------
        | Read Only
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might only be interested in the
        | data that the sheet exists. By default we ignore all styles,
        | however if you want to do some logic based on style data
        | you can enable it by setting read_only to false.
        |
        */
        'read_only' => true,

importsの記述からさらに下の方へ進み

 'csv'         => [
            'delimiter'        => null,
            'enclosure'        => '"',
            'escape_character' => '\\',
            'contiguous'       => false,
            //'input_encoding'   => 'UTF-8', デフォルト
						'input_encoding'   => 'CP932',//拡張shift-jis
        ],

importの方にもcsvの記述ありました。
その中のinput_encodingの値をデフォルトではUTF-8となっているので、「CP932」もしくは「SHIFT-JIS」にしましょう。これでSHIFT-JISのファイルがアップロード可能となります。