忍者ブログ

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

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

PHP Spoutを使用してエクセル出力・セルスタイル設定の方法について

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();














PR

コメント

コメントを書く