Help us understand the problem. What is going on with this article?

LaravelでCSVダウンロード機能を実装する。

CSVダウンロード機能を実装するにあたり、少しはまった部分があったので備忘録です。

流れ

  1. 出力データを用意
  2. 出力データをカンマ区切りで配列にセット
  3. 改行区切りの文字列に変換
  4. 一時的にCSVファイルを作成
  5. CSVファイルに書き込み
  6. ダウンロードレスポンスを返す。

実装

はまったポイント
- 金額など、値にカンマが含まれる文字の扱い -> 値をクオートで囲むことで1つの値として評価される。
- 出力結果が改行されnai -> 改行コードをダブルコートで囲むことで改行コードとして評価される。
- Excelで開いたときに文字化けする -> SJISにエンコーディングする。

public function downloadCsv()
{
    // 1. 出力データをを用意
    $csvHeader = ["No,", 師匠名, ふりがな];
    $csvData = [
        [0001, 春風亭助羊, しゅんぷうてい すけよう],
        [0002, 桂左志郎, かつら さしろう],
        [0003, 三遊亭遊智, さんゆうてい ゆうち],
        [0004, 月亭がた枝, つきてい がたし],
        [0005, 春雨や雷扇, はるさめや らいおう],
        [0006, 桂喜八宝, かつら きゃぽう],
        [0007, 翁家八ゑ千代, おきなや やえちよ],
        [0008, 春雨や雷海, はるさめや らいかい],
    ];

    // 2. 出力データをカンマ区切りで配列にセット
    $downloadData = [];
    $downloadData[] = implode(',', $csvHeader);

    foreach ($csvData as $record) {
        // 念の為ダブルクオートで囲む
        foreach ($record as $i => $v) {
            $record[$i] = '"' . $v . '"';
        }

        $downloadData[] = implode(',', $record);
    }

    // 3. 改行区切りの文字列に変換
    $downloadData = implode("\r", $downloadData); // 改行コードはダブルクオートで囲む

    // Excel対応
    $downloadData = mb_convert_encoding($downloadData, "SJIS", "UTF-8");

    // 4. 一時的にcsvファイルを作成
    if (! file_exists(storage_path('csv'))) {
        $bool = mkdir(storage_path('csv'));

        if (! $bool) {
            throw new Exception("ディレクトリを作成できませんでした。", 500);
        }
    }
    $name = 'test.csv';
    $pathToFile = storage_path('csv/' . $name);

    // 5. CSVファイルを作成
    if (! file_put_contents($pathToFile, $csvData)) {
        throw new Exception("ファイルの書き込みに失敗しました。", 500);
    }

    // 6. ダウンロードレスポンスを返却
    return response()->download($pathToFile, $name)->deleteFileAfterSend(true);
}

参考

https://gray-code.com/php/download-for-csv-file/
https://teratail.com/questions/2199
https://bayashita.com/p/entry/show/49
https://qiita.com/ikemonn/items/f2bc4f9f834c989084ff
https://www.megasoft.co.jp/support/mifes/faq/miw8faq/faq017.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした