忍者ブログ

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

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

PHP Spoutを使用してエクセル出力・ワークシートの処理の方法について・その2

今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」に行データ追加を行う方法について説明したいと思います。






■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();
?>

出力されたエクセルファイルは最初の場合と同様となります。













PR

コメント

コメントを書く