[FuelPHP] CSV出力を実装する方法

2 min read

案件で CSV 出力を実装したのでメモ

Excel で UTF-8 の CSV ファイルは開けない

理由

Excelの場合、CSVファイルはShift-JISとして開く

このため、UTF-8 の CSV ファイルを Excel で開きたい場合は

  • 拡張子を別のものに変えて開く
  • 先頭に三バイトのBOMを付与したCSVファイルで開く
など、手間がかかる、

FuelPHPでの準備

FuelPHPでCSVファイルを出力する場合、CSVファイル用に拵えた配列をto_csv()に渡してやる必要がある。

この手の出力は RestController を使うと楽だが当該案件ではエラーハンドリングなどがあり RestController を使うのは見送った。

以下のようにto_csv()をオーバライドする

class Format extends Fuel\Core\Format {
  public function to_csv($data = null){
    $csv = parent::to_csv($data);
    return mb_convert_encoding($csv, 'SJIS-win', 'UTF-8');
  }
}

参考引用: FuelPHP で CSV の出力 - Qiita

mb_convert_encodingを挟んでUTF-8からSJIS-winに文字エンコーディングを変換する。

これで Excel で開ける CSV ファイルへ変換する事ができる。

CSVファイルを出力する

public static function export_csv($array, $csv_name) {
  // Response
  $response = new Response();

// content-type: csv
$response->set_header('Content-Type', 'application/csv');

// ファイル名をセット
$response->set_header('Content-Disposition', 'attachment; filename="'. $csv_name .'"');

// キャッシュをなしに
$response->set_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate');
$response->set_header('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT');
$response->set_header('Pragma', 'no-cache');

// CSV を出力
echo Format::forge($array)->to_csv();

// Response
return $response;
}


お作法通りに出力する。
出力するファイル名などを変えるならここで変える。