今回は PHPExcel でCSVファイルの「読み込み」及び「書き込み」について説明したいと思います。
CSVファイルはカンマで区切られたテキストファイルで、他のシステムからのデータの取り込みや、ユーザに対してのデータの提供などでよく使われます。
「読み込み」及び「書き込み」に対応したクラス「PHPExcel_Reader_CSV」「PHPExcel_Writer_CSV」がありますので、これらを使って処理を行います。
■CSVファイルの「読み込み」(読込後、新規にエクセル書込み)
CSVファイルの「読み込み」を行うには PHPExcel_Reader_CSV クラスを使います。
PHPExcel_Reader_CSV クラスを生成し setInputEncoding メソッドで 文字コード を設定します。
更に setDelimiter メソッドで 区切り記号 を設定し setEnclosure メソッドで 囲み文字 を設定します。
最後に load メソッドで CSVファイルを読み込み PHPExcelオブジェクト を生成します。
この PHPExcelオブジェクト を出力することでエクセルファイルに出力できます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(0); // 読込の結果としてPHPExcelオブジェクトが返る $objPHPExcel = $objReader->load("test10.csv"); // [test10-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
「test10.csv」の内容は以下の通りです。
"AAAAAAA","BBB","CCC" "aaaa","bbb","ccc" "ああああ","いいい","漢字データ"
■CSVファイルの「読み込み」(読込後、既存エクセルに追加し書込み)
既に存在するエクセルファイルを読込んでおき、CSVファイルの「読み込み」を行ったシートデータをエクセルデータに追加する方法を説明します。
手順としては、最初に PHPExcel_IOFactory::load() メソッドで既存エクセルファイルを読込みます。
その後は、上記の例の様に PHPExcel_Reader_CSV クラスを生成し、CSVのオプションを設定し loadIntoExisting() メソッドでPHPExcelオブジェクトに追加します。
ここで注意するのは setSheetIndex() メソッドで、シートの位置が任意に指定できることです。
今回は「2」としますので、結果のエクセルファイルには3番目のシートとして生成されます。
また、PHPExcelオブジェクトに追加する時に2番目のシートは存在しないので、空のシートが生成されます。
後はPHPExcelオブジェクトを別名のエクセルファイルで書き込みます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(2); // 読込の結果をPHPExcelオブジェクトに追加する $objReader->loadIntoExisting("test10.csv", $objPHPExcel); // [test10-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
「Worksheet 2」「Worksheet 3」のシートが追加されています。 「Worksheet 2」は全てが空白のシートで、「Worksheet 3」は今回追加したシートです。
尚、シートの位置指定で以下の様に既存のシートの場所にすると、その場所に上書きされる様です。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(0); // 読込の結果をPHPExcelオブジェクトに追加する $objReader->loadIntoExisting("test10-1.csv", $objPHPExcel); // [test10-2-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-2-1.xlsx'); exit(); ?>
「test10-1.csv」の内容
"a11","b22" "いいい","漢字データ"
出力されたエクセルファイルを見てみると以下の様になります。
■CSVファイルの「書き込み」
CSVファイルの「書き込み」を行うには PHPExcel_Writer_CSV クラスを使います。
PHPExcelオブジェクト を引数にして PHPExcel_Writer_CSV クラスを生成します。
setDelimiter メソッドで 区切り記号 を setEnclosure メソッドで 囲み文字 を setLineEnding メソッドで 改行コード を設定します。
また setUseBOM メソッドで「UTF-8」ファイルとしての「BOM」ファイルヘッダを出力する指定をします。
さらに setSheetIndex メソッドで出力するシート位置を指定します。
最後に save メソッドで CSVファイルを書込みます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV書込クラス生成 $objWriter = new PHPExcel_Writer_CSV($objPHPExcel); // 区切り記号(カンマ) $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」ファイルヘッダが在るため、エクセルでもそのまま開くことが出来ます。
コメント