忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PhpSpreadsheet CSVファイルの読み込み・書き込みについて


今回は PhpSpreadsheet でCSVファイルの「読み込み」及び「書き込み」について説明したいと思います。

CSVファイルはカンマで区切られたテキストファイルで、他のシステムからのデータの取り込みや、ユーザに対してのデータの提供などでよく使われます。

「読み込み」及び「書き込み」に対応したクラス「PhpOffice\PhpSpreadsheet\Reader\Csv」「PhpOffice\PhpSpreadsheet\Writer\Csv」がありますので、これらを使って処理を行います。




■CSVファイルの「読み込み」(読込後、新規にエクセル書込み)

CSVファイルの「読み込み」を行うには PhpOffice\PhpSpreadsheet\Reader\Csv クラスを使います。

PhpOffice\PhpSpreadsheet\Reader\Csv クラスを生成し setInputEncoding メソッドで 文字コード を設定します。
更に setDelimiter メソッドで 区切り記号 を設定し setEnclosure メソッドで 囲み文字 を設定します。
最後に load メソッドで CSVファイルを読み込み PhpSpreadsheetオブジェクト を生成します。

この PhpSpreadsheetオブジェクト を出力することでエクセルファイルに出力できます。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// CSV読込クラス生成
$objReader = new Csv();
// CSVファイルの文字コード:Shift-JIS
$objReader->setInputEncoding('SJIS');
// 区切り記号(カンマ)
$objReader->setDelimiter(',');
// 文字列の囲み文字(")
$objReader->setEnclosure('"');
// シートの位置
$objReader->setSheetIndex(0);
// 読込の結果としてPhpSpreadsheetオブジェクトが返る
$objSpreadsheet = $objReader->load("test10.csv");

// [test10-1.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test10-1.xlsx');
exit();
?>

出力されたエクセルファイルを見てみると以下の様になります。


「test10.csv」の内容は以下の通りです。

"AAAAAAA","BBB","CCC"
"aaaa","bbb","ccc"
"ああああ","いいい","漢字データ"




■CSVファイルの「読み込み」(読込後、既存エクセルに追加し書込み)

既に存在するエクセルファイルを読込んでおき、CSVファイルの「読み込み」を行ったシートデータをエクセルデータに追加する方法を説明します。

手順としては、最初に IOFactory::load() メソッドで既存エクセルファイルを読込みます。
その後は、上記の例の様に Reader\Csv クラスを生成し、CSVのオプションを設定し loadIntoExisting() メソッドでPhpSpreadsheetオブジェクトに追加します。

ここで注意するのは setSheetIndex() メソッドで、シートの位置が任意に指定できることです。
今回は「2」としますので、結果のエクセルファイルには3番目のシートとして生成されます。
また、PhpSpreadsheetオブジェクトに追加する時に2番目のシートは存在しないので、空のシートが生成されます。

後はPhpSpreadsheetオブジェクトを別名のエクセルファイルで書き込みます。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成
$objSpreadsheet = IOFactory::load('./test10-1.xlsx');

// CSV読込クラス生成
$objReader = new Csv();
// CSVファイルの文字コード:Shift-JIS
$objReader->setInputEncoding('SJIS');
// 区切り記号(カンマ)
$objReader->setDelimiter(',');
// 文字列の囲み文字(")
$objReader->setEnclosure('"');
// シートの位置
$objReader->setSheetIndex(2); 
// 読込の結果をSpreadsheetオブジェクトに追加する
$objReader->loadIntoExisting("test10.csv", $objSpreadsheet);

// [test10-2.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test10-2.xlsx');
?>

出力されたエクセルファイルを見てみると以下の様になります。
「Worksheet 2」「Worksheet 3」のシートが追加されています。 「Worksheet 2」は全てが空白のシートで、「Worksheet 3」は今回追加したシートです。



尚、シートの位置指定で以下の様に既存のシートの場所にすると、その場所に上書きされる様です。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成
$objSpreadsheet = IOFactory::load('./test10-1.xlsx');

// CSV読込クラス生成
$objReader = new Csv();
// CSVファイルの文字コード:Shift-JIS
$objReader->setInputEncoding('SJIS');
// 区切り記号(カンマ)
$objReader->setDelimiter(',');
// 文字列の囲み文字(")
$objReader->setEnclosure('"');
// シートの位置
$objReader->setSheetIndex(0); 
// 読込の結果をSpreadsheetオブジェクトに追加する
$objReader->loadIntoExisting("test10-1.csv", $objSpreadsheet);

// [test10-2-1.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test10-2-1.xlsx');
?>

「test10-1.csv」の内容

"a11","b22"
"いいい","漢字データ"

出力されたエクセルファイルを見てみると以下の様になります。




■CSVファイルの「書き込み」

CSVファイルの「書き込み」を行うには PhpOffice\PhpSpreadsheet\Writer\Csv クラスを使います。

PhpSpreadsheetオブジェクト を引数にして PhpOffice\PhpSpreadsheet\Writer\Csv クラスを生成します。
setDelimiter メソッドで 区切り記号setEnclosure メソッドで 囲み文字setLineEnding メソッドで 改行コード を設定します。
また setUseBOM メソッドで「UTF-8」ファイルとしての「BOM」ファイルヘッダを出力する指定をします。
さらに setSheetIndex メソッドで出力するシート位置を指定します。

最後に save メソッドで CSVファイルを書込みます。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Csv;

// [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成
$objSpreadsheet = IOFactory::load('./test10-1.xlsx');

// CSV書込クラス生成
$objWriter = new Csv($objSpreadsheet);
// 区切り記号(カンマ)
$objWriter->setDelimiter(',');
// 文字列の囲み文字(")
$objWriter->setEnclosure('"');
// 改行コード
$objWriter->setLineEnding("\r\n");
// 「UTF-8」ファイルとしての「BOM」ファイルヘッダ
$objWriter->setUseBOM(true);
// シートの位置
$objWriter->setSheetIndex(0);
// 書込み処理
$objWriter->save("test10-3.csv");

exit();
?>

出力されたCSVファイル「test10-3.csv」は以下の様になります。

"AAAAAAA","BBB","CCC"
"aaaa","bbb","ccc"
"ああああ","いいい","漢字データ"


生成されるCSVファイルは「UTF-8」のコードですが、「BOM」ファイルヘッダが在るため、エクセルでもそのまま開くことが出来ます。












PR

コメント

コメントを書く