eightban's memo

残しておきたい記事をまとめてみました。このブログに書いてあるドキュメントやブログで配布しているファイルの使用によって発生するいかなる損害に対してもこのブログの管理者は責任を負いません。使用する場合は自己責任のもとに使用してください。

PHP

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

Copyright© eightban's memo , 2024 All Rights Reserved Powered by STINGER.