LaravelでCSVを作成・ダウンロード
LaravelでCSVを作成・ダウンロードする場合、LaraCSVが非常に便利なのでご紹介します。
目次
LaraCSV
インストール
$ composer require usmanhalalit/laracsv:^2.0
モデル(コレクション)からCSVを生成
LaraCSVは、モデルのデータを使ってCSVを生成することができます。
$users = User::all();
$csvExporter = new \Laracsv\Export();
$csvExporter->build($users, [
'name' => 'ユーザー名',
'email' => 'メールアドレス',
]);
$csvReader = $csvExporter->getReader();
表示データの加工
日付のフォーマットを変更したい場合には、CSVを生成する前に各データの加工することができます。
$users = User::all();
$csvExporter = new \Laracsv\Export();
$csvExporter->beforeEach(function ($user) {
$user->created_at = $user->created_at->format('Y-m-d');
});
$csvExporter->build($users, [
'name' => 'ユーザー名',
'email' => 'メールアドレス',
'created_at' => '登録日',
]);
$csvReader = $csvExporter->getReader();
文字化け対策(BOMの設定)
エクセルで開いた際にUTF-8だと文字化けするのを防ぐためにBOMを設定が必要です。
$csvReader->setOutputBOM(\League\Csv\Reader::BOM_UTF8);
ユーザー情報をCSVで出力するサンプル
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\User;
class UserController extends Controller
{
public function csv()
{
$users = User::all();
$csvExporter = new \Laracsv\Export();
$csvExporter->beforeEach(function ($user) {
$user->created_at = $user->created_at->format('Y-m-d');
});
$csvExporter->build($users, [
'name' => 'ユーザー名',
'email' => 'メールアドレス',
'created_at' => '登録日',
]);
$csvReader = $csvExporter->getReader();
$csvReader->setOutputBOM(\League\Csv\Reader::BOM_UTF8);
$filename = 'sample.csv';
return response((string) $csvReader)
->header('Content-Type', 'text/csv; charset=UTF-8')
->header('Content-Disposition', 'attachment; filename="'.$filename.'"');
}
}
連想配列からCSVを作成
モデルだけではなく、連想配列をObject
に変換したものからもCSVに変換できます。
$collection = collect([
(object) [
'website' => 'twitter',
'url' => 'twitter.com'
],
(object) [
'website' => 'google',
'url' => 'google.com'
]
]);
$csvExporter = new \Laracsv\Export();
$csvExporter->build($collection, [
'website' => 'ウェブサイト',
'url' => 'URL',
]);
$csvReader = $csvExporter->getReader();
CSVをダウンロードさせる
作成したCSVは以下のコードによってダウンロードすることも可能です。
$csvReader = $csvExporter->getReader();
$csvReader->setOutputBOM(\League\Csv\Reader::BOM_UTF8);
return response((string) $csvReader)
->header('Content-Type', 'text/csv; charset=UTF-8')
->header('Content-Disposition', 'attachment; filename="'.$filename.'"');