League/csvを利用しCSVを読込みテンプレートのExcelに書き込む ~ PHP
PHPにはCSVを読み書きする便利なライブラリがあります。Goodby CSV、Volcanus_Csv、League/csvなどありますが、説明が詳しいLeague/csvを利用してみます。
PHP >= 7.0.10 の場合はleague/csv:^9.0となります。
League/csvのインストール
まずcomposerでインストールです。簡単にインストールできます。
composer require league/csv
D:\oss\PHP\PHP726>composer require league/csv Using version ^9.1 for league/csv ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing league/csv (9.1.4): Downloading (100%) Writing lock file Generating autoload files
League/csvを使ったCSV読込処理の作成
簡単に短いコーディングで記述できます。
<?php require "d:/oss/php/php726/vendor/autoload.php"; use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader; use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter; use League\Csv\Reader; // Excel読込 $reader = new XlsxReader(); $spreadsheet = $reader->load('test.xlsx'); // CSVファイルの読み込み $csv = Reader::createFromPath('test.csv'); // レコードを読み $records = $csv->getRecords(); $line = 0; foreach ($records as $index => $dataRow) { $line++; for($i = 0; $i < count( $dataRow ); ++$i ){ //列、行指定 $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow( $i + 1, $line, $dataRow[$i] ); } } // Excel出力 $writer = new XlsxWriter($spreadsheet); $writer->save('test4.xlsx');
シフトJISの漢字のセルは「FALSE」となります。文字コードも指定できるようなので対応します。
日本語で説明しているサイトが見つからなかったので、英語のマニュアルのサイトを見ました。
https://csv.thephpleague.com/9.0/converter/charset/
use League\Csv\CharsetConverter
の追加と
$encoder = (new CharsetConverter())->inputEncoding('sjis-win’);
$records = $encoder->convert($csv);
$records = $encoder->convert($csv);
を置きえます。
<?php require "d:/oss/php/php726/vendor/autoload.php"; use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader; use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter; use League\Csv\Reader; use League\Csv\CharsetConverter; // Excel読込 $reader = new XlsxReader(); $spreadsheet = $reader->load('test.xlsx'); // CSVファイルの読み込み $csv = Reader::createFromPath('test.csv'); // レコードを読み //$records = $csv->getRecords(); $encoder = (new CharsetConverter())->inputEncoding('sjis-win'); $records = $encoder->convert($csv); $line = 0; foreach ($records as $index => $dataRow) { $line++; for($i = 0; $i < count( $dataRow ); ++$i ){ //列、行指定 $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow( $i + 1, $line, $dataRow[$i] ); } } // Excel出力 $writer = new XlsxWriter($spreadsheet); $writer->save('test5.xlsx');
fgetcsvを使った場合シフトJISでは文字化けが起きる可能性があるので、ライブラリを使うなどの対応をとったほうがよさそうです。
ただ、League/csvはメジャーバージョン違うと文法が違うことがあるので注意が必要です。
マニュアルとサンプルが充実していてよいライブラリと思います。
ディスカッション
コメント一覧
まだ、コメントがありません