Spout のセルなどへのスタイル設定は PhpSpreadsheet の様にセルに対してスタイルを設定するのではなく、 設定するセルデータや列データに対してスタイルを設定しておいたものを、エクセルのデータとして追加設定する方式になっています。
セルデータや列データを宣言する前にスタイル設定データを生成しておいて、セルデータ等の生成時に付加してやります。
Spout の導入の以下の記事で簡単なエクセル出力を紹介しましたが、そのソースを元にスタイル設定を追加することで説明したいと思います。
⇒PHP Spoutを使用してエクセル出力を行う方法について(Spoutをcomposerでインストール)
■セルデータへのスタイル設定について
セルデータの生成は WriterEntityFactory::createCell() 関数で行いますがこの関数の第2引数にはスタイルの設定値を指定できます。
// createCell宣言 public static function createCell($cellValue, Style $cellStyle = null) // $cellValue : セルデータ // $cellStyle : セルスタイル(デフォルトはNULL)
この「$cellStyle」ですが StyleBuilder クラスを生成し、各種のスタイル設定を行ってから build 関数でスタイル値を作成します。
以下の様な感じです。
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
// StyleBuilderでスタイル生成
$sb = new StyleBuilder();
$style = $sb ->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::BLUE)
->build();
StyleBuilder クラスの持つ各種関数は後の方で説明します。
このクラスを使った簡単な例を以下の項目で記します。
■セルデータへのスタイル設定による簡単な例
以下のプログラムでは、 StyleBuilder クラスを生成し「フォント名:'MS ゴシック'」「フォントサイズ:15」「前景色:青、赤、緑」のスタイルを生成します。 前景色ごとに3種のスタイルとして生成し、それを各セル毎に指定します。
<?php
require '../vendor/autoload.php';
// 利用クラスエイリアス
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
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('test3-1.xlsx');
// StyleBuilderでスタイル生成
$style1 = (new StyleBuilder())
->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::BLUE)
->build();
$style2 = (new StyleBuilder())
->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::RED)
->build();
$style3 = (new StyleBuilder())
->setFontName('MS ゴシック')
->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();
?>
出力されたエクセルファイルを見てみると以下の様になります。
同じ内容ですが、3行のデータが追加されたことが分かります。
■行データへのスタイル設定を追加した例
行データの生成は WriterEntityFactory::createRow() 関数で行いますがこの関数の第2引数にはスタイルの設定値を指定できます。
// createRow宣言 public static function createRow(array $cells = [], Style $rowStyle = null) // $cells : セルデータ配列 // $rowStyle : 行スタイル(デフォルトはNULL)
以下のプログラムでは、行スタイル設定で StyleBuilder クラスを生成し「フォントをボールド」「デフォルト」の2種類のスタイルを生成します。 このスタイルを別々に生成したセルデータに対して設定します。
<?php
require '../vendor/autoload.php';
// 利用クラスエイリアス
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
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('test3-2.xlsx');
// StyleBuilderでスタイル生成
$style1 = (new StyleBuilder())
->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::BLUE)
->build();
$style2 = (new StyleBuilder())
->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::RED)
->build();
$style3 = (new StyleBuilder())
->setFontName('MS ゴシック')
->setFontSize(15)
->setFontColor(Color::GREEN)
->build();
// セルデータ
$cells1 = [
WriterEntityFactory::createCell('A001', $style1),
WriterEntityFactory::createCell('B002', $style2),
WriterEntityFactory::createCell('C003', $style3),
];
$cells2 = [
WriterEntityFactory::createCell('A001', $style1),
WriterEntityFactory::createCell('B002', $style2),
WriterEntityFactory::createCell('C003', $style3),
];
// 行スタイル生成
// ボールドスタイル
$rowStyle1 = (new StyleBuilder())
->setFontBold()
->build();
// デフォルトのスタイル
$rowStyle2 = (new StyleBuilder())
->build();
// 行データ
$singleRow1 = WriterEntityFactory::createRow($cells1, $rowStyle1);
$singleRow2 = WriterEntityFactory::createRow($cells2, $rowStyle2);
// NGの方法
//$singleRow2 = WriterEntityFactory::createRow($cells1, $rowStyle2);
// 行データを追加
$writer->addRow($singleRow1);
$writer->addRow($singleRow2);
// エクセルファイルの書込
$writer->close();
?>
「$cells1」のみを使って2個の行スタイル「$rowStyle1」「$rowStyle2」を割り当てて行データを作って、行データ追加を行っても 同じ内容の2行が表示される。(「$singleRow2」の生成を「NGの方法」で行った場合は以下の様になります。)
セルデータを分けて、それぞれに別の行スタイルを設定することでOKな感じになりました。
■スタイル設定の各設定関数について
それでは StyleBuilder クラスのスタイル設定関数を以下に記します。
| カテゴリ | 設定 | 関数 |
|---|---|---|
| Font | Bold | StyleBuilder::setFontBold() |
| Italic | StyleBuilder::setFontItalic() | |
| Underline | StyleBuilder::setFontUnderline() | |
| Strikethrough | StyleBuilder::setFontStrikethrough() | |
| Font name | StyleBuilder::setFontName($strFontName):フォント名指定 | |
| Font size | StyleBuilder::setFontSize($intFontSize):フォントサイズ指定 | |
| Font Color | StyleBuilder::setFontColor(Color::BLUE):カラークラス色名 StyleBuilder::setFontColor(Color::rgb(0, 128, 255)):RGB指定 |
|
| Alignment | Cell alignment | StyleBuilder::setCellAlignment(CellAlignment::CENTER) :セルアライメントクラスの名称 |
| Wrap text | StyleBuilder::setShouldWrapText(true) | |
| Format (XLSX only) |
Number format | StyleBuilder::setFormat('0.000') |
| Date format | StyleBuilder::setFormat('yy/mm/dd HH:mm') |
なお、上記の関数は戻り値に自分の StyleBuilder クラスのオブジェクトを返すため、 関数呼び出しのチェインができます。
// StyleBuilderでスタイル生成
$sb = new StyleBuilder();
$style = $sb ->setFontName('MS ゴシック')
->setFontSize(15)
->setFontBold()
->setFontItalic()
->setFontColor(Color::BLUE)
->build();
コメント