前回までは「ワークシート」のことを気にせず、カラムデータ生成から行データを作成し「ワークシート」に追加していました。
今回は複数の「ワークシート」の追加などについて説明したいと思います。
■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つのシートに同じ行データが書き込まれていることが分かります。
コメント