忍者ブログ

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

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

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

前回の以下の記事で「エクセル出力・セルスタイル設定」を紹介しましたが、今回はさらにセルのボーダー(枠線)設定について説明したいと思います。

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 ゴシック」とフォント名が表示されています。














PR

コメント

コメントを書く