みなさま、お疲れさまです。
今回は、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の出力ができているはずです。
ぜひ試してみてください。