[2023/04/20] PHP Spoutを使用してエクセル出力・ワークシートの処理の方法について・その3(あるセルに値追加) (No.326)
[2023/04/19] PHP Spoutを使用してエクセル出力・ワークシートの処理の方法について・その2 (No.325)
[2023/04/18] PHP Spoutを使用してエクセル出力・ワークシートの処理の方法について (No.324)
[2023/04/11] PHP Spoutを使用してエクセル出力・セルスタイル設定(ボーダー設定)の方法について (No.323)
-
以前、以下の記事などで紹介した内容ですが、PHPのバージョンを「7.4」にアップした時についでにPhpSpreadsheetを「1.25」のバージョンにしたのですが、 下のプログラムを実行するとエクセルファイルは作成されますが、チャートはエラーが出て表示されません。
⇒PHP PhpSpreadsheet ワークシート上にチャート(グラフ)を作成する方法について(PhpSpreadsheet\Chart)該当エクセルファイルを開くとエラーが表示される。
■チャートが表示されないソース
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Chart\Chart; use PhpOffice\PhpSpreadsheet\Chart\DataSeries; use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; use PhpOffice\PhpSpreadsheet\Chart\PlotArea; use PhpOffice\PhpSpreadsheet\Chart\Title; use PhpOffice\PhpSpreadsheet\IOFactory; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト取得 $objWorksheet = $objSpreadsheet->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), array('商品2', 18, 19, 23, 14, 21), //追加 array('商品3', 15, 10, 20, 12, 23), //追加 ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$F$2', NULL, 5), //商品1 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$3:$F$3', NULL, 5), //商品2 追加 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$4:$F$4', NULL, 5), //商品3 追加 ); // チャート・データシリーズの生成 $objSeries = new DataSeries( DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping(DataSeries::GROUPING_STANDARD) range(0, count($arrDataSeriesValues) - 1), // plotOrder array(), // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new Title('売上データ'); // チャート生成 $objChart = new Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6'); // 左上 $objChart->setBottomRightPosition('G18'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-1-2.xlsx]:Excel2007形式で保存する $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx'); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1-2.xlsx'); exit(); ?>
このソースでチャートを表示させるには「チャート生成:new Chart」の引数の中の「displayBlanksAs」を「0」ではなく以下のどれかを指定する必要があります。
■PhpOffice\PhpSpreadsheet\Chart\DataSeries.php 内の宣言
const EMPTY_AS_GAP = 'gap'; const EMPTY_AS_ZERO = 'zero'; const EMPTY_AS_SPAN = 'span';
よって「チャート生成:new Chart」部分のソースは以下の様にします。
// チャート生成 $objChart = new Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly DataSeries::EMPTY_AS_GAP, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel );
PhpSpreadsheetの記事の中え「チャート生成:new Chart」の引数の中の「displayBlanksAs」を「0」にしているものがほとんどですので、 上記の様に読み替えて下さい。
関連する記事
⇒PhpSpreadsheet ワークシート上にチャート(グラフ)を作成する方法について(PhpSpreadsheet\Chart)
⇒PhpSpreadsheet\Chart ワークシート上にチャート(Bar Chart:棒グラフ)を作成する方法について
⇒PhpSpreadsheet\Chart ワークシート上にチャート(Bar Chart:棒グラフ、複数レベルの項目軸ラベル)を作成する方法について
⇒PhpSpreadsheet\Chart 1個のチャート上に異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について
⇒PhpSpreadsheet\Chart エクセルシート上に複数のチャートで異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について
⇒PhpSpreadsheet\Chart ワークシート上に円グラフ・チャート(Pie Chart)とドーナツグラフ・チャート(Donut Chart)、及びレーダーチャート(Radar Chart)を作成する方法について
⇒PhpSpreadsheet\Chart ワークシートにチャートが存在するエクセルファイル(テンプレート)の系列データ部分を変更し別のファイルとして登録する方法について
PR -
今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」にあるセルにセルデータを追加し、行データ追加を行う方法について説明したいと思います。
■XLSXの読込・書込クラスを使用したワークシートのコピー・セルデータを追加
今回の処理では「XLSX読込クラス」の内部に持っているワークシートを順次取得する getSheetIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことでワークシートのオブジェクトが取得できます。
そのワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことで行データのオブジェクトが取得できます。
その後、行データのオブジェクトがNULLの場合には、空の行データを生成し、XLSX書込クラスへの行追加を行います。 NULLではない場合にはそのままXLSX書込クラスへの行追加を行います。
その行データからセルデータオブジェクト配列を取得し、その配列からを順次カラムデータとして取り出すために array_map() 関数で行います。 結果としてデータの配列が生成されます。
生成されたデータの配列から新規の追加用行データオブジェクトを作成します。 行データオブジェクトの setCellAtIndex($cell, $Index) 関数でセルデータの設定(置き換え)ができます。
<?php require '../vendor/autoload.php'; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; // XLSX読込クラス生成 $strReadFile = 'test7-1.xlsx'; $reader = ReaderEntityFactory::createReaderFromFile($strReadFile); // 空行の読み込み許可 $reader->setShouldPreserveEmptyRows(true); // 読み込み $reader->open($strReadFile); // XLSX書込クラス生成 $writer = WriterEntityFactory::createXLSXWriter(); $writer->openToFile('test7-1-New.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); // 新規追加するセルデータ生成 $newCell = WriterEntityFactory::createCell('A001'); // セルデータ設定 $newRow->setCellAtIndex($newCell, 5); // 書込みへの追加 $writer->addRow($newRow); } } // XLSX読込・書込クラスクローズ $reader->close(); $writer->close(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
左側が読込んだエクセルで、右側が新たに書込んだエクセルです。 6番目のセルに「'A001'」が設定されたことが分かります。
■XLSXの読込・書込クラスを使用したワークシートのコピー・データ行を指定してセルデータを追加
ワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)ではキーとして、行Indexを返すことができます。 この行Indexを判定すれば、意図した行にのみ処理が可能となります。<?php require '../vendor/autoload.php'; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; // XLSX読込クラス生成 $strReadFile = 'test7-1.xlsx'; $reader = ReaderEntityFactory::createReaderFromFile($strReadFile); // 空行の読み込み許可 $reader->setShouldPreserveEmptyRows(true); // 読み込み $reader->open($strReadFile); // XLSX書込クラス生成 $writer = WriterEntityFactory::createXLSXWriter(); $writer->openToFile('test7-2-New.xlsx'); // 全てのワークシートを取得 foreach($reader->getSheetIterator() as $sheet) { // ワークシートの全行を取得 foreach ($sheet->getRowIterator() as $rowIndex => $row) { // [$row]がNULLの場合を考慮し、セル値の配列生成 $cellValues = array_map(function($cell) { return $cell->getValue(); }, $row->getCells()); // セル値の配列から行データ生成 $newRow = WriterEntityFactory::createRowFromArray($cellValues); // 行が2行目と5行目のみ処理 if ($rowIndex == 2 || $rowIndex == 5) { $cell = WriterEntityFactory::createCell('A001'); $newRow->setCellAtIndex($cell, 5); } // 書込みへの追加 $writer->addRow($newRow); } } // XLSX読込・書込クラスクローズ $reader->close(); $writer->close(); ?>
出力されたエクセルファイルを見てみると以下の様になります。 2行目と5行目のみにセルデータが設定されています。
-
今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」に行データ追加を行う方法について説明したいと思います。
■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(); ?>
出力されたエクセルファイルは最初の場合と同様となります。
-
前回までは「ワークシート」のことを気にせず、カラムデータ生成から行データを作成し「ワークシート」に追加していました。
今回は複数の「ワークシート」の追加などについて説明したいと思います。
■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つのシートに同じ行データが書き込まれていることが分かります。
-
前回の以下の記事で「エクセル出力・セルスタイル設定」を紹介しましたが、今回はさらにセルのボーダー(枠線)設定について説明したいと思います。
⇒PHP Spoutを使用してエクセル出力・セルスタイル設定の方法について
■セルデータへのボーダー(枠線)のスタイル設定について
ボーダー(枠線)のスタイル設定を行うために、ボーダークラスを生成し、そのオブジェクトをスタイルクラスに設定します。
ボーダークラスは BorderBuilder を生成し、そのクラスのボーダーの「上、右、下、左」に対して設定を行います。 ボーダーの「上、右、下、左」に対して別々の関数が用意されていますが、引数は全て同じです。// setBorderTop宣言 public function setBorderTop($color = Color::BLACK, $width = Border::WIDTH_MEDIUM, $style = Border::STYLE_SOLID) // $color : ボーダーカラー (カラー宣言もしくはRGB値指定:デフォルトは黒) // $width : ボーダー幅 (デフォルトはWIDTH_MEDIUM) // $style : ボーダースタイル(デフォルトはSTYLE_SOLID) //「以下の関数の引数も同様」 // setBorderRight宣言 public function setBorderRight($color = Color::BLACK, $width = Border::WIDTH_MEDIUM, $style = Border::STYLE_SOLID) // setBorderBottom宣言 public function setBorderBottom($color = Color::BLACK, $width = Border::WIDTH_MEDIUM, $style = Border::STYLE_SOLID) // setBorderLeft宣言 public function setBorderLeft($color = Color::BLACK, $width = Border::WIDTH_MEDIUM, $style = Border::STYLE_SOLID)
実際には BorderBuilder でボーダーを生成し、ボーダー設定を行ってから build 関数でボーダー値を作成します。
そのボーダー値を StyleBuilder クラスを生成したものに setBorder 関数で設定を行ってから build 関数でスタイル値を作成します。
以下の様な感じです。use Box\Spout\Common\Entity\Style\Border; use Box\Spout\Writer\Common\Creator\Style\BorderBuilder; use Box\Spout\Writer\Common\Creator\Style\StyleBuilder; // BorderBuilderでボーダー生成(ボーダー「上」のみ設定:「青色」「細い幅」「実線」) $border = (new BorderBuilder()) ->setBorderTop(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->build(); // StyleBuilderでスタイル生成 $style = (new StyleBuilder()) ->setBorder($border) ->build();
■セルデータへのボーダー・スタイル設定による簡単な例
以下のプログラムでは、 BorderBuilder クラスを生成し「上、右、下」のボーダーには「カラー:青(宣言値)、幅:太い、線種:実線」の設定を行っています。 また、「左」のみ「カラー」設定で rgb() 関数で「red、green、blue」の値を設定します。
このボーダー値を StyleBuilder で生成されたスタイルに設定しています。<?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(); // 書込みファイル指定 $writer->openToFile('test4-1.xlsx'); // ボーダー生成 $border = (new BorderBuilder()) ->setBorderTop(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderRight(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderBottom(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderLeft(Color::rgb(255, 0, 0), Border::WIDTH_THICK, Border::STYLE_SOLID) ->build(); // StyleBuilderでスタイル生成 $style1 = (new StyleBuilder()) ->setFontName('MS ゴシック') ->setBorder($border) ->setFontSize(15) ->setFontColor(Color::BLUE) ->build(); $style2 = (new StyleBuilder()) ->setFontName('MS ゴシック') ->setBorder($border) ->setFontSize(15) ->setFontColor(Color::RED) ->build(); $style3 = (new StyleBuilder()) ->setFontName('MS ゴシック') ->setBorder($border) ->setFontSize(15) ->setFontColor(Color::GREEN) ->build(); // セルデータ $cells = [ WriterEntityFactory::createCell('A001', $style1), WriterEntityFactory::createCell('B002', $style2), WriterEntityFactory::createCell('C003', $style3), ]; // 行データ $singleRow = WriterEntityFactory::createRow($cells); // 行データを3行追加 $writer->addRow($singleRow); $writer->addRow($singleRow); $writer->addRow($singleRow); // エクセルファイルの書込 $writer->close(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
各セルの左側の枠線が赤色に設定されたことが分かります。■行データへのボーダー・スタイル設定を追加した例
行データの生成は WriterEntityFactory::createRow() 関数で行いますがこの関数の第2引数にはスタイルの設定値を指定できます。// createRow宣言 public static function createRow(array $cells = [], Style $rowStyle = null) // $cells : セルデータ配列 // $rowStyle : 行スタイル(デフォルトはNULL)
以下のプログラムでは、行スタイル設定で StyleBuilder クラスを生成しボーダーのみのスタイルを生成します。 このスタイルを行データに対して設定します。
<?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(); // 書込みファイル指定 $writer->openToFile('test4-2.xlsx'); // ボーダー生成 $border = (new BorderBuilder()) ->setBorderTop(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderRight(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderBottom(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderLeft(Color::rgb(255, 0, 0), Border::WIDTH_THICK, Border::STYLE_SOLID) ->build(); // StyleBuilderでスタイル生成 $style = (new StyleBuilder()) ->setBorder($border) ->build(); // セルデータ $cells = [ WriterEntityFactory::createCell('A001'), WriterEntityFactory::createCell('B002'), WriterEntityFactory::createCell('C003'), ]; // 行データ(スタイル設定付加) $singleRow = WriterEntityFactory::createRow($cells, $style); // 行データを3行追加 $writer->addRow($singleRow); $writer->addRow($singleRow); $writer->addRow($singleRow); // エクセルファイルの書込 $writer->close(); ?>
これを実行すると以下の様になります。
フォント名、フォントサイズ設定は行っていないので spout のデフォルト値「Calibri」になっているので、上の方の例より文字が小さい感じです。
なお、次の項目ではシート全体にフォント設定を行って「Calibri」を「MS ゴシック」にします。■シート全体にスタイル設定を行う
シート全体にスタイル設定を行うには BorderBuilder クラスを生成し各種のスタイルを設定した スタイルオブジェクトを XLSX書込クラス の setDefaultRowStyle 関数で設定します。
<?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('test4-3.xlsx'); // ボーダー生成 $border = (new BorderBuilder()) ->setBorderTop(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderRight(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderBottom(Color::BLUE, Border::WIDTH_THICK, Border::STYLE_SOLID) ->setBorderLeft(Color::rgb(255, 0, 0), Border::WIDTH_THICK, Border::STYLE_SOLID) ->build(); // StyleBuilderでスタイル生成 $style = (new StyleBuilder()) ->setBorder($border) ->build(); // セルデータ $cells = [ WriterEntityFactory::createCell('A001'), WriterEntityFactory::createCell('B002'), WriterEntityFactory::createCell('C003'), ]; // 行データ $singleRow = WriterEntityFactory::createRow($cells, $style); // 行データを3行追加 $writer->addRow($singleRow); $writer->addRow($singleRow); $writer->addRow($singleRow); // エクセルファイルの書込 $writer->close(); ?>
これを実行すると以下の様になります。
先ほどのフォントとは異なるので、表示される文字の雰囲気が変わっています。 また、現在の「A5」セルのフォントはエクセルのメニューリボンに「MS ゴシック」とフォント名が表示されています。