第13章
第13章 · 初心者向け

CSV出力

表データをファイルにして渡す、業務で頻出の機能です。

1. CSVとは

カンマで区切ったテキスト。Excelや他システム連携でよく使う
ID,タイトル,完了
1,書類提出,0
2,買い物,1

2. DBから対象データ取得

$todos = $this->Todos->find()
    ->where(['user_id' => $userId])
    ->all();

3. CSV用にデータを加工

1行目は見出し、2行目からデータ、が分かりやすいです。

$rows = [];
$rows[] = ['ID', 'タイトル', '完了'];
foreach ($todos as $todo) {
    $rows[] = [$todo->id, $todo->title, $todo->done ? '1' : '0'];
}

4. CSVレスポンス

ブラウザに「これはダウンロード用」と伝えます。

$this->response = $this->response->withType('csv');
$this->response = $this->response->withDownload('todos.csv');

5. ファイルとして出力

public function export()
{
    $todos = $this->Todos->find()->all();
    $fh = fopen('php://temp', 'r+');
    fputcsv($fh, ['ID', 'Title', 'Done']);
    foreach ($todos as $todo) {
        fputcsv($fh, [$todo->id, $todo->title, (int)$todo->done]);
    }
    rewind($fh);
    $csv = stream_get_contents($fh);
    fclose($fh);

    return $this->response
        ->withType('csv')
        ->withDownload('todos.csv')
        ->withStringBody($csv);
}

6. 日本語・文字コードについて

Excelで文字化けしたら

UTF-8の先頭に BOM を付ける、または SJIS に変換する、のどれかが必要なことがあります。

$csv = "\xEF\xBB\xBF" . $csv; // UTF-8 BOM の例

第13章 やってみよう

EXERCISE
  1. 見出し+データ行の配列を作る
  2. ダウンロード用レスポンスの骨格を写経する
  3. 日本語タイトルで文字化けしないか確認する