[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
前回までは「ワークシート」のことを気にせず、カラムデータ生成から行データを作成し「ワークシート」に追加していました。
今回は複数の「ワークシート」の追加などについて説明したいと思います。
■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つのシートに同じ行データが書き込まれていることが分かります。
コメント