【Laravel】CSVエクスポートについて

みなさま、お疲れさまです。

今回は、LaravelのCSVのエクスポートの方法についてまとめたいと思います。

 

前提

例えば、以下の画像のような顧客情報のCSVを出力したいとします。

 

ヘッダ部分は1行目、2行目以降は顧客情報を入れていきます。

 

①ヘッダ部分と顧客情報を用意する。

まずヘッダ部分に入れる文言を配列に用意します。

$header = [
  '顧客ID',
  '姓',
  '名',
  '姓(かな)',
  '名(かな)',
  '生年月日',
  '郵便番号',
  '都道府県',
  '市区町村',
  '番地以降',
  '電話番号'
];

その次に顧客情報を用意します。

今回は、配列に直接データを代入しますが、データベースからデータを取得する場合は、

取得したデータを配列に入れてください。

$csvDatas = [
  '0' => [
    '1',
    '山田',
    '花子',
    'やまだ',
    'はなこ',
    '1990/1/1',
    '1234567',
    '東京都',
    '新宿区',
    '',
    '="' . '012345678' . '="'
  ],
  '1' => [
    '2',
    '鈴木',
    '太郎',
    'すずき',
    'たろう',
    '1992/2/10',
    '2223333',
    '大阪府',
    '大阪市',
    '',
    '="' . '09012345678' . '="'
  ], ......... // 以降は省略します。
];

電話番号は、「0」から始まると自動で消えてしまう場合があるので、「’=”‘ . ‘電話番号’ . ‘=”‘」と記述しています。

②ヘッダ部分をCSVに書き込む。

$callback = function () use ($header) {
  $handle = fopen('php://output', 'w');

  mb_convert_variables('SJIS-win', 'UTF-8', $header);
  fputcsv($handle, $headers);
};

いくつか関数について解説していきます。

fopen()

ファイルを作成する関数です。

第1引数は、内容の書き込み先を指定します。

今回の「php://output」は、書き込み専用のストリームのことです。php://output は書き込み専用のストリームで、 print および echo と同じ方法での出力バッファへの書き込みを許可します。(PHPサイトより引用)

mb_convert_variables()

文字コードを変換する関数です。

第1引数は、変換後のエンコーディング、第2引数は変換前のエンコーディング、第3引数は変換する値を入れます。

fputcsv()

行をCSV形式にして、ファイルに書き込みます。

③顧客情報をCSVに書き込む。

②のコールバック関数の中で定義していきます。

foreach ($csvDatas as $csvData) {
  mb_convert_variables('SJIS-win', 'UTF-8', $csvData);
  fputcsv($handle, $csvData);
}

fputcsv()で1行ずつ書き込んでくれるということですね。

 

④作成したCSVファイルを出力する。

全てファイルにデータを書き込んだらCSVファイルを出力します。

②③を合わせて全文記述します。

$callback = function () use ($header) {
  // ファイル作成
  $handle = fopen('php://output', 'w');

  // ヘッダ書き込み
  mb_convert_variables('SJIS-win', 'UTF-8', $header);
  fputcsv($handle, $headers);

  // 顧客情報書き込み
  foreach ($csvDatas as $csvData) {
    mb_convert_variables('SJIS-win', 'UTF-8', $csvData);
    fputcsv($handle, $csvData);
  }

  // ファイルを閉じる
  fclose($handle);
};

// HTTPヘッダ
$headers = [
  'Content-Type' => 'text/csv',
  'Content-Disposition' => 'attachment; filename=顧客データ_' . date('YmdHis') . '.csv'
];

return responce()->stream($callback, 200, $headers);

 

うまくいけばこれで顧客データのCSVの出力ができているはずです。

ぜひ試してみてください。