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

案件で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;
}

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

twitterfacebookhatenafacebook