前提
- csv扱うの面倒なのでなるべく楽したい(SJISとか特に)
- Laravel5.5(PHP7.2)の環境が構築済み
操作
usmanhalalit/laracsvを使う。
このままだとUTF-8しか対応していなので、継承して少し修正する。
まず
composer require usmanhalalit/laracsv:^2.0
完了したらば下記のクラス・コードを適当なところに追加する
<?php
namespace App\HogeService;
use SplTempFileObject;
use Laracsv\Export;
use League\Csv\Writer;
use League\Csv\CharsetConverter;
/**
*
*/
class HogeCsvExport extends Export
{
/**
*
* @return void
*/
public function __construct()
{
$encoder = (new CharsetConverter())->outputEncoding('SJIS');
$writerObject = Writer::createFromFileObject(new SplTempFileObject)->setNewline("\r\n");
$this->csv = $writerObject->addFormatter($encoder);
}
}
namespace App\HogeService
とHogeCsvExport
は任意の名称で。
(new CharsetConverter())->outputEncoding('SJIS');
と
Writer::createFromFileObject(new SplTempFileObject)->setNewline("\r\n")
で任意の文字コードと改行コードを設定する。
柔軟性をもたせるなら、__construct
の引数に文字コードと改行コードを設定すれば良いかな?
/**
*
* @return void
*/
public function __construct(string $encoding, string $newLine)
{
$encoder = (new CharsetConverter())->outputEncoding($encoding);
$writerObject = Writer::createFromFileObject(new SplTempFileObject)->setNewline($newLine);
$this->csv = $writerObject->addFormatter($encoder);
}
入力の文字コードも変更したい場合はinputEncoding
を使えば良い。
詳しくはusmanhalalit/laracsvの関連ソースコードを参照ください。
$encoder = (new CharsetConverter())->inputEncoding('SJIS');