忍者ブログ

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

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

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

前回までは「ワークシート」のことを気にせず、カラムデータ生成から行データを作成し「ワークシート」に追加していました。

今回は複数の「ワークシート」の追加などについて説明したいと思います。






■XLSX書込クラスのワークシート関連関数

XLSX書込クラスのクラスには以下の様な、ワークシートに関連した関数があります。

関数戻り値備考
getCurrentSheet() ワークシート
オブジェクト
カレントのワークシートオブジェクトを返す
addNewSheetAndMakeItCurrent() ワークシート
オブジェクト
新規のワークシートを生成しカレントのワークシートオブジェクト
として返す
setCurrentSheet($sheet)
 $sheet : ワークシート
なし 指定されたワークシートをカレントのワークシートとする
getSheets() ワークシート
オブジェクト配列
ワークブックの全てのワークシートオブジェクトを配列として返す


これらの関数の使い方ですが「XLSX書込クラス」を生成し、オブジェクト変数に設定しますが このオブジェクトが処理対象としているのはカレントシートです。
そのカレントシートを変更することで、行データ等の追加されるワークシートが変わります。

以下の例では createXLSXWriter 関数で「XLSX書込クラス」を生成しカレントのワークシートに行データを追加しています。 このクラス生成直後は最初の1つのワークシートを生成し、そのワークシートがカレントになります。

その後 addNewSheetAndMakeItCurrent 関数でワークシートを追加していますが、 この時点でカレントワークシートが追加されたものになります。 その後で addRow 関数で処理すると追加のワークシートに行データが反映されます。

<?php
// 利用クラスエイリアスなどの宣言は省略...

// XLSX書込クラス生成
$writer = WriterEntityFactory::createXLSXWriter();
// 書込みファイル指定
$writer->openToFile('testaaa.xlsx');

// セルデータ
$cells = [
    WriterEntityFactory::createCell('A001'),
    WriterEntityFactory::createCell('B002'),
    WriterEntityFactory::createCell('C003'),
];
// 行データ
$row = WriterEntityFactory::createRow($cells);
// カレントシートへの書込み
$writer->addRow($row);

// シートを追加しカレントシートにする
$sheetNew = $writer->addNewSheetAndMakeItCurrent();
// 追加シートに行データ追加
$writer->addRow($row);

// エクセルファイルの書込
$writer->close();
?>


それではもう少し処理を追加した例を以下の項目で記します。

■XLSX書込クラスのワークシート関連関数を使用した簡単な例


以下のプログラムでは、「行データ1」と「行データ2」を生成し、最初のワークシートに「行データ1」を追加します。 その後、新規ワークシートを追加し「行データ2」を追加します。 さらにカレントのワークシートを最初のシートに切り替えて「行データ2」を追加します。

<?php
require '../vendor/autoload.php';

// 利用クラスエイリアス
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Style\Border;
use Box\Spout\Writer\Common\Creator\Style\BorderBuilder;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;

// XLSX書込クラス生成
$writer = WriterEntityFactory::createXLSXWriter();
// XLSX書込クラスへのデフォルトスタイル
$defaultStyle = (new StyleBuilder())
                ->setFontName('MS ゴシック')
                ->setFontSize(14)
                ->build();
// XLSX書込クラスへのデフォルトスタイル
$writer->setDefaultRowStyle($defaultStyle);
// 書込みファイル指定
$writer->openToFile('test5-1.xlsx');

// セルデータ1
$cells1 = [
    WriterEntityFactory::createCell('A001'),
    WriterEntityFactory::createCell('B002'),
    WriterEntityFactory::createCell('C003'),
];
// 行データ1
$row1 = WriterEntityFactory::createRow($cells1);

// セルデータ2
$cells2 = [
    WriterEntityFactory::createCell('aaa001'),
    WriterEntityFactory::createCell('bbb002'),
    WriterEntityFactory::createCell('ccc003'),
];
// 行データ2
$row2 = WriterEntityFactory::createRow($cells2);

// 最初のカレントシート
$sheet1 = $writer->getCurrentSheet();
// シート名設定
$sheet1->setName('テスト1');
// カレントシート($sheet1)に[行データ1]追加
$writer->addRow($row1);

// シートを追加しカレントシートにする
// (ここで[$writer]は追加シートに対しての処理となる)
$sheet2 = $writer->addNewSheetAndMakeItCurrent();
// シート名設定
$sheet2->setName('テスト2');
// カレントシート($sheet2)に[行データ2]追加
$writer->addRow($row2);

// カレントシートを最初のシートに戻す
$writer->setCurrentSheet($sheet1);
// 最初のシートに[行データ2]追加
$writer->addRow($row2);

// エクセルファイルの書込
$writer->close();
?>

出力されたエクセルファイルを見てみると以下の様になります。
最初のシートに「行データ1」「行データ2」が書き込まれ、2番目のシートには「行データ2」が書き込まれていることが分かります。



■複数のワークシートの処理の例


以下の例では createXLSXWriter 関数で「XLSX書込クラス」を生成しカレントのワークシートを取得しています。
その後 addNewSheetAndMakeItCurrent 関数でワークシートを2個追加します。
全てのワークシートを getSheets 関数で取得し setCurrentSheet 関数でカレントのワークシートを変更しながら 行データを追加しています。

<?php
require '../vendor/autoload.php';

// 利用クラスエイリアス
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Style\Border;
use Box\Spout\Writer\Common\Creator\Style\BorderBuilder;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;

// XLSX書込クラス生成
$writer = WriterEntityFactory::createXLSXWriter();
// XLSX書込クラスへのデフォルトスタイル
$defaultStyle = (new StyleBuilder())
                ->setFontName('MS ゴシック')
                ->setFontSize(14)
                ->build();
// XLSX書込クラスへのデフォルトスタイル
$writer->setDefaultRowStyle($defaultStyle);
// 書込みファイル指定
$writer->openToFile('test5-2.xlsx');

// セルデータ1
$cells1 = [
    WriterEntityFactory::createCell('A001'),
    WriterEntityFactory::createCell('B002'),
    WriterEntityFactory::createCell('C003'),
];
// 行データ
$row1 = WriterEntityFactory::createRow($cells1);

// 最初のカレントシート
$sheet1 = $writer->getCurrentSheet();
// 2個のシート追加
$sheet2 = $writer->addNewSheetAndMakeItCurrent();
$sheet3 = $writer->addNewSheetAndMakeItCurrent();

// 全てのシートの取得
$sheets = $writer->getSheets();
foreach($sheets as $sheet) {
    // カレントシートの設定
    $writer->setCurrentSheet($sheet);
    // 行データを追加
    $writer->addRow($row1);
}

// エクセルファイルの書込
$writer->close();
?>

出力されたエクセルファイルを見てみると以下の様になります。
3つのシートに同じ行データが書き込まれていることが分かります。














PR

コメント

コメントを書く