フレームワーク

LaravelでCSV出力を行う方法

フレームワーク

PHPを使って業務を行っているとファイルのアップロードやインポートなどCSVを扱う場面が多くあります。
PHPでCSVを扱う方法はいくつかありますが、ここではその中でも特に簡単な方法を紹介していきます。

CSV出力とは

CSV出力とは、データをCSV形式のファイル(CSVファイル)で出力(ダウンロード)することを言います。
CSVファイルは、値をカンマで区切ったファイルでさまざまなソフトウェアで利用できます。

そのため、Excelで開いて編集したりデータベースに取り込んだりすることが容易になり、非常に便利です。

それでは、実際にCSV出力してみましょう。

実装

今回は、画面の「CSV出力」ボタンを押すとpostCSVメソッドが呼び出され、表示されているデータがCSV形式で出力されるように実装します。

画面表示

事前にViewやControllerを作成しておきましょう。

<resources/views/user/index.blade.php>

<html>
  <head>
    <title>CSV出力</title>
  </head>
  <body>
    <h1>CSV出力</h1>
    <form action="{{ route('user.CSV') }}" method="post">
      @csrf
      <table border="1" width="200">
        <tr>
          <th>名前</th>
          <th>年齢</th>
        </tr>
        @foreach($users as $user)
        <tr>
          <td>{{ $user['name'] }}</td>
          <td>{{ $user['age'] }}</td>
        </tr>
        @endforeach
      </table>
      <button type="submit">CSV出力</button>
    </form>
  </body>
</html>

<実際の画面>

<UserController.php>

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
   /**
    * 画面表示
    */
    public function getIndex()
    {
        $users = [
            ['name' => '太郎', 'age' => 24],
            ['name' => '花子', 'age' => 21]
        ];

        return view('user.index', compact('users'));
    }

   /**
    * CSV出力
    */
    public function postCSV()
    {
        //
    }
}

ViewやControllerが作成出来たら、画面が表示されるか一度実際にアクセスしてみましょう。

CSV出力

では、実際にCSV出力を行う部分を実装していきましょう。
postCSVメソッドに以下のコードを追記してください。

/**
 * CSV出力
 */
 public function postCSV()
 {
     // データの作成
     $users = [
         ['name' => '太郎', 'age' => 24],
         ['name' => '花子', 'age' => 21]
     ];
     // カラムの作成
     $head = ['名前', '年齢'];

     // 書き込み用ファイルを開く
     $f = fopen('test.csv', 'w');
     if ($f) {
         // カラムの書き込み
         mb_convert_variables('SJIS', 'UTF-8', $head);
         fputcsv($f, $head);
         // データの書き込み
         foreach ($users as $user) {
            mb_convert_variables('SJIS', 'UTF-8', $user);
            fputcsv($f, $user);
         }
     }
     // ファイルを閉じる
     fclose($f);

     // HTTPヘッダ
     header("Content-Type: application/octet-stream");
     header('Content-Length: '.filesize('test.csv'));
     header('Content-Disposition: attachment; filename=test.csv');
     readfile('test.csv');

     return view('user.index', compact('users'));
}

それぞれのコードの働きはコメントの通りです。
mb_convert_variables()は文字コードを「UTF-8」から「SJIS」に変換しています。
CSVファイルは基本的にSJISで保存するため、UTF-8のまま書き込むと文字化けしてしまいます。
実際に書き込みを行っているのはfputcsv()です。

それでは、「CSV出力」ボタンを押してCSV出力をしてみましょう。
上手くいけばpublicの下にtest.csvというCSVファイルが作成されているはずです。

まとめ

今回はLaravelの環境下で行いましたが、CSVの出力を行う部分については他のフレームワークでも応用できます。
PHPを扱っているとCSV出力はよく使うのでぜひ覚えておきましょう。

タイトルとURLをコピーしました