今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」にあるセルにセルデータを追加し、行データ追加を行う方法について説明したいと思います。
■XLSXの読込・書込クラスを使用したワークシートのコピー・セルデータを追加
今回の処理では「XLSX読込クラス」の内部に持っているワークシートを順次取得する getSheetIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことでワークシートのオブジェクトが取得できます。
そのワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことで行データのオブジェクトが取得できます。
その後、行データのオブジェクトがNULLの場合には、空の行データを生成し、XLSX書込クラスへの行追加を行います。 NULLではない場合にはそのままXLSX書込クラスへの行追加を行います。
その行データからセルデータオブジェクト配列を取得し、その配列からを順次カラムデータとして取り出すために array_map() 関数で行います。 結果としてデータの配列が生成されます。
生成されたデータの配列から新規の追加用行データオブジェクトを作成します。 行データオブジェクトの setCellAtIndex($cell, $Index) 関数でセルデータの設定(置き換え)ができます。
<?php
require '../vendor/autoload.php';
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
// XLSX読込クラス生成
$strReadFile = 'test7-1.xlsx';
$reader = ReaderEntityFactory::createReaderFromFile($strReadFile);
// 空行の読み込み許可
$reader->setShouldPreserveEmptyRows(true);
// 読み込み
$reader->open($strReadFile);
// XLSX書込クラス生成
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile('test7-1-New.xlsx');
// 全てのワークシートを取得
foreach($reader->getSheetIterator() as $sheet) {
// ワークシートの全行を取得
foreach($sheet->getRowIterator() as $row) {
// [$row]がNULLの場合を考慮し、セル値の配列生成
$cellValues = array_map(function($cell) {
return $cell->getValue();
}, $row->getCells());
// セル値の配列から行データ生成
$newRow = WriterEntityFactory::createRowFromArray($cellValues);
// 新規追加するセルデータ生成
$newCell = WriterEntityFactory::createCell('A001');
// セルデータ設定
$newRow->setCellAtIndex($newCell, 5);
// 書込みへの追加
$writer->addRow($newRow);
}
}
// XLSX読込・書込クラスクローズ
$reader->close();
$writer->close();
?>
出力されたエクセルファイルを見てみると以下の様になります。
左側が読込んだエクセルで、右側が新たに書込んだエクセルです。 6番目のセルに「'A001'」が設定されたことが分かります。
■XLSXの読込・書込クラスを使用したワークシートのコピー・データ行を指定してセルデータを追加
ワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)ではキーとして、行Indexを返すことができます。 この行Indexを判定すれば、意図した行にのみ処理が可能となります。
<?php
require '../vendor/autoload.php';
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
// XLSX読込クラス生成
$strReadFile = 'test7-1.xlsx';
$reader = ReaderEntityFactory::createReaderFromFile($strReadFile);
// 空行の読み込み許可
$reader->setShouldPreserveEmptyRows(true);
// 読み込み
$reader->open($strReadFile);
// XLSX書込クラス生成
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile('test7-2-New.xlsx');
// 全てのワークシートを取得
foreach($reader->getSheetIterator() as $sheet) {
// ワークシートの全行を取得
foreach ($sheet->getRowIterator() as $rowIndex => $row) {
// [$row]がNULLの場合を考慮し、セル値の配列生成
$cellValues = array_map(function($cell) {
return $cell->getValue();
}, $row->getCells());
// セル値の配列から行データ生成
$newRow = WriterEntityFactory::createRowFromArray($cellValues);
// 行が2行目と5行目のみ処理
if ($rowIndex == 2 || $rowIndex == 5) {
$cell = WriterEntityFactory::createCell('A001');
$newRow->setCellAtIndex($cell, 5);
}
// 書込みへの追加
$writer->addRow($newRow);
}
}
// XLSX読込・書込クラスクローズ
$reader->close();
$writer->close();
?>
出力されたエクセルファイルを見てみると以下の様になります。 2行目と5行目のみにセルデータが設定されています。
コメント