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はメジャーバージョン違うと文法が違うことがあるので注意が必要です。
マニュアルとサンプルが充実していてよいライブラリと思います。








ディスカッション
コメント一覧
まだ、コメントがありません