LaravelでCSVを生成

LaravelでCSVを生成

LaravelでCSVを生成を生成する場合、LaraCSVが非常に便利なのでご紹介します。

LaraCSV

GitHub

インストール

$ 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();