[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」に行データ追加を行う方法について説明したいと思います。
■XLSXの読込・書込クラスを使用したワークシートのコピー
今回の処理では「XLSX読込クラス」の内部に持っているワークシートを順次取得する getSheetIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことでワークシートのオブジェクトが取得できます。
そのワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことで行データのオブジェクトが取得できます。
その後、行データのオブジェクトがNULLの場合には、空の行データを生成し、XLSX書込クラスへの行追加を行います。 NULLではない場合にはそのままXLSX書込クラスへの行追加を行います。
<?php require '../vendor/autoload.php'; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; // XLSX読込クラス生成 $strReadFile = 'test6-1.xlsx'; $reader = ReaderEntityFactory::createReaderFromFile($strReadFile); // 空行の読み込み許可 $reader->setShouldPreserveEmptyRows(true); // 読み込み $reader->open($strReadFile); // XLSX書込クラス生成 $writer = WriterEntityFactory::createXLSXWriter(); $writer->openToFile('test6-1-New.xlsx'); // 全てのワークシートを取得 foreach($reader->getSheetIterator() as $sheet) { // ワークシートの全行を取得 foreach($sheet->getRowIterator() as $row) { if (empty($row)) { // 空行の場合 $emptyRow = WriterEntityFactory::createRowFromArray([]); $writer->addRow($emptyRow); } else { // 読込行の書込みへの追加 $writer->addRow($row); } } } // XLSX読込・書込クラスクローズ $reader->close(); $writer->close(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
左側が読込んだエクセルで、右側が新たに書込んだエクセルです。 2行目、5行目が空白行ですが、右側のエクセルはその行が若干幅が狭くなっている様です。
これは読込んだ時の行データがNULLなので空行を作成した時にデフォルトの縦幅が設定された様です。 このあたりは改良の余地が在るかも知れません。
■XLSXの読込・書込クラスを使用したワークシートのコピーその2
以下のプログラムでは、上で説明した行データがNULLの場合に空行を作成して新規のエクセルに追加する部分ですが、 以下のソースの様に array_map() 関数で置き換えができます。
<?php require '../vendor/autoload.php'; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; // XLSX読込クラス生成 $strReadFile = 'test6-1.xlsx'; $reader = ReaderEntityFactory::createReaderFromFile($strReadFile); // 空行の読み込み許可 $reader->setShouldPreserveEmptyRows(true); // 読み込み $reader->open($strReadFile); // XLSX書込クラス生成 $writer = WriterEntityFactory::createXLSXWriter(); $writer->openToFile('test6-1-New2.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); // 書込みへの追加 $writer->addRow($newRow); } } // XLSX読込・書込クラスクローズ $reader->close(); $writer->close(); ?>
出力されたエクセルファイルは最初の場合と同様となります。
コメント