League/csvを利用しCSVを読込みテンプレートのExcelに書き込む ~ PHP

PHPにはCSVを読み書きする便利なライブラリがあります。Goodby CSV、Volcanus_Csv、League/csvなどありますが、説明が詳しいLeague/csvを利用してみます。

https://csv.thephpleague.com/

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);

を置きえます。

<?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はメジャーバージョン違うと文法が違うことがあるので注意が必要です。

マニュアルとサンプルが充実していてよいライブラリと思います。

 

PHP

Posted by eightban