Laravel ExcelでCSV出力したらSJISで出せなかったので自分で書きました
佐川急便か何かのシステムと連携するために、Shift_JISで出力したCSVを作成する必要があり、もともとseedデータ用にLaravel Excelを利用していたため、同じLaravel Excelで実装しようと思いました。
実装はめちゃくちゃ楽だったのですが、Shift_JISで出すために、mb_convert_encodingで文字列をエンコードして設定したところ、値があるにも関わらず、出力ファイルに空文字が出力されてしまいました。
$csvRecords = [/*省略*/];
$now = new Carbon();
Excel::create('download-' . $now->format('Ymdhis'), function($excel) use ($csvRecords) {
$excel->sheet('Sheetname', function($sheet) use
($csvRecords) {
$data = $csvRecords;
$sheet->fromArray($data, null, 'A1', false, false);
});
})->export('csv');
開発者のQAを見ると、
@zhukangfeng
And is there any way to download CSV file not in UTF-8, but such as Japanese’s encoding SJIS when use class LaravelExcelWriter.
@patrickbrouwers
No, sorry. Not at the moment.
ということで、対応していないようです(そもそもLaravelExcelはPHPExcelというライブラリのラッパーで、PHPExcelが対応していない)
ということで、早々に諦めて自分で実装します。
$csvRecords = [/*省略*/];
header('Content-Type: text/plain;charset=UTF-8');
$stream = fopen('php://output', 'w');
foreach ($csvRecords as $csvRecord) {
fputcsv($stream, $csvRecord);
}
header("Content-Type: application/octet-stream");
$now = new Carbon();
$filename = 'download-' . $now->format('Ymdhis') . '.csv';
header("Content-Disposition: attachment; filename=" . $filename);
echo mb_convert_encoding(ob_get_clean(), 'SJIS', 'UTF-8');
これで無事に出力されました。