[2023/04/18] PHP Spoutを使用してエクセル出力・ワークシートの処理の方法について (No.324)
[2023/04/11] PHP Spoutを使用してエクセル出力・セルスタイル設定(ボーダー設定)の方法について (No.323)
[2023/04/10] PHP Spoutを使用してエクセル出力・セルスタイル設定の方法について (No.322)
[2023/04/07] PHP Spoutを使用してCSVファイル及び、ODSファイル出力を行う方法について (No.321)
-
今回はある「ワークシート」から行データを順次読み込み、別の「ワークシート」に行データ追加を行う方法について説明したいと思います。
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■XLSXの読込・書込クラスを使用したワークシートのコピー
今回の処理では「XLSX読込クラス」の内部に持っているワークシートを順次取得する getSheetIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことでワークシートのオブジェクトが取得できます。
そのワークシートのオブジェクトの内部に持っている行データを順次取得する getRowIterator() 関数(イテレータ)を使用します。 この関数を foreach 文で呼出すことで行データのオブジェクトが取得できます。
その後、行データのオブジェクトがNULLの場合には、空の行データを生成し、XLSX書込クラスへの行追加を行います。 NULLではない場合にはそのままXLSX書込クラスへの行追加を行います。
123456789101112131415161718192021222324252627282930313233343536<?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() 関数で置き換えができます。1234567891011121314151617181920212223242526272829303132333435<?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();
?>
出力されたエクセルファイルは最初の場合と同様となります。
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
PR -
前回までは「ワークシート」のことを気にせず、カラムデータ生成から行データを作成し「ワークシート」に追加していました。
今回は複数の「ワークシート」の追加などについて説明したいと思います。
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■XLSX書込クラスのワークシート関連関数
XLSX書込クラスのクラスには以下の様な、ワークシートに関連した関数があります。
関数 戻り値 備考 getCurrentSheet() ワークシート
オブジェクトカレントのワークシートオブジェクトを返す addNewSheetAndMakeItCurrent() ワークシート
オブジェクト新規のワークシートを生成しカレントのワークシートオブジェクト
として返すsetCurrentSheet($sheet)
$sheet : ワークシートなし 指定されたワークシートをカレントのワークシートとする getSheets() ワークシート
オブジェクト配列ワークブックの全てのワークシートオブジェクトを配列として返す
これらの関数の使い方ですが「XLSX書込クラス」を生成し、オブジェクト変数に設定しますが このオブジェクトが処理対象としているのはカレントシートです。
そのカレントシートを変更することで、行データ等の追加されるワークシートが変わります。
以下の例では createXLSXWriter 関数で「XLSX書込クラス」を生成しカレントのワークシートに行データを追加しています。 このクラス生成直後は最初の1つのワークシートを生成し、そのワークシートがカレントになります。
その後 addNewSheetAndMakeItCurrent 関数でワークシートを追加していますが、 この時点でカレントワークシートが追加されたものになります。 その後で addRow 関数で処理すると追加のワークシートに行データが反映されます。123456789101112131415161718192021222324252627<?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」を追加します。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364<?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 関数でカレントのワークシートを変更しながら 行データを追加しています。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<?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でのシステム開発を学べる入門書です。
-
前回の以下の記事で「エクセル出力・セルスタイル設定」を紹介しましたが、今回はさらにセルのボーダー(枠線)設定について説明したいと思います。
⇒PHP Spoutを使用してエクセル出力・セルスタイル設定の方法について
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■セルデータへのボーダー(枠線)のスタイル設定について
ボーダー(枠線)のスタイル設定を行うために、ボーダークラスを生成し、そのオブジェクトをスタイルクラスに設定します。
ボーダークラスは BorderBuilder を生成し、そのクラスのボーダーの「上、右、下、左」に対して設定を行います。 ボーダーの「上、右、下、左」に対して別々の関数が用意されていますが、引数は全て同じです。12345678910111213// 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 関数でスタイル値を作成します。
以下の様な感じです。123456789101112use
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 で生成されたスタイルに設定しています。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263<?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引数にはスタイルの設定値を指定できます。1234// createRow宣言
public
static
function
createRow(
array
$cells
= [], Style
$rowStyle
= null)
// $cells : セルデータ配列
// $rowStyle : 行スタイル(デフォルトはNULL)
以下のプログラムでは、行スタイル設定で StyleBuilder クラスを生成しボーダーのみのスタイルを生成します。 このスタイルを行データに対して設定します。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748<?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 関数で設定します。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354<?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 ゴシック」とフォント名が表示されています。
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
-
Spout のセルなどへのスタイル設定は PhpSpreadsheet の様にセルに対してスタイルを設定するのではなく、 設定するセルデータや列データに対してスタイルを設定しておいたものを、エクセルのデータとして追加設定する方式になっています。
セルデータや列データを宣言する前にスタイル設定データを生成しておいて、セルデータ等の生成時に付加してやります。
Spout の導入の以下の記事で簡単なエクセル出力を紹介しましたが、そのソースを元にスタイル設定を追加することで説明したいと思います。
⇒PHP Spoutを使用してエクセル出力を行う方法について(Spoutをcomposerでインストール)
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■セルデータへのスタイル設定について
セルデータの生成は WriterEntityFactory::createCell() 関数で行いますがこの関数の第2引数にはスタイルの設定値を指定できます。
1234// createCell宣言
public
static
function
createCell(
$cellValue
, Style
$cellStyle
= null)
// $cellValue : セルデータ
// $cellStyle : セルスタイル(デフォルトはNULL)
この「$cellStyle」ですが StyleBuilder クラスを生成し、各種のスタイル設定を行ってから build 関数でスタイル値を作成します。
以下の様な感じです。12345678use
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種のスタイルとして生成し、それを各セル毎に指定します。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<?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引数にはスタイルの設定値を指定できます。1234// createRow宣言
public
static
function
createRow(
array
$cells
= [], Style
$rowStyle
= null)
// $cells : セルデータ配列
// $rowStyle : 行スタイル(デフォルトはNULL)
以下のプログラムでは、行スタイル設定で StyleBuilder クラスを生成し「フォントをボールド」「デフォルト」の2種類のスタイルを生成します。 このスタイルを別々に生成したセルデータに対して設定します。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566<?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 クラスのオブジェクトを返すため、 関数呼び出しのチェインができます。12345678// StyleBuilderでスタイル生成
$sb
=
new
StyleBuilder();
$style
=
$sb
->setFontName(
'MS ゴシック'
)
->setFontSize(15)
->setFontBold()
->setFontItalic()
->setFontColor(Color::BLUE)
->build();
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
-
Spout のインストール記事での簡単例としてエクセルファイル(XLSXファイル)への出力を記しました。
Spout にはXLSXファイルのみならず、CSVファイル、ODSファイルへの出力も可能で、 XLSXファイルの場合とまったく同じ形式で処理できます。
上記3種類のファイルの処理クラスを各タイプごとのものを、処理の先頭で宣言してやります。
その後のデータ処理はほぼ同じものになります。
先ずは前回の例のソースを以下に記します。
■XLSXファイルの書込み例
123456789101112131415161718192021222324252627282930<?php
// ライブラリ読込
require
'../vendor/autoload.php'
;
// 利用クラスエイリアス
use
Box\Spout\Writer\Common\Creator\WriterEntityFactory;
// XLSX書込クラス生成
$writer
= WriterEntityFactory::createXLSXWriter();
// 書込みファイル指定
$writer
->openToFile(
'test.xlsx'
);
// セルデータ
$cells
= [
WriterEntityFactory::createCell(
'A001'
),
WriterEntityFactory::createCell(
'B002'
),
WriterEntityFactory::createCell(
'C003'
),
];
// 行データ
$singleRow
= WriterEntityFactory::createRow(
$cells
);
// 行データを3行追加
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
// エクセルファイルの書込
$writer
->close();
?>
■CSVファイルの書込み例
以下のソースから分かる様に、XLSX書込クラス生成 WriterEntityFactory::createXLSXWriter() が WriterEntityFactory::createCSVWriter() に変わり、ファイル名の拡張子が CSV 用になっています。123456789101112131415161718192021222324252627282930<?php
// ライブラリ読込
require
'../vendor/autoload.php'
;
// 利用クラスエイリアス
use
Box\Spout\Writer\Common\Creator\WriterEntityFactory;
// CSV書込クラス生成
$writer
= WriterEntityFactory::createCSVWriter();
// 書込みファイル指定
$writer
->openToFile(
'test.csv'
);
// セルデータ
$cells
= [
WriterEntityFactory::createCell(
'A001'
),
WriterEntityFactory::createCell(
'B002'
),
WriterEntityFactory::createCell(
'C003'
),
];
// 行データ
$singleRow
= WriterEntityFactory::createRow(
$cells
);
// 行データを3行追加
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
// エクセルファイルの書込
$writer
->close();
?>
出力されたCSVファイルをエディタ(秀丸ですが)で見てみると以下の様になります。■ODSファイルの書込み例
以下のソースから分かる様に、XLSX書込クラス生成 WriterEntityFactory::createXLSXWriter() が WriterEntityFactory::createODSWriter() に変わり、ファイル名の拡張子が ODS 用になっています。
ちなみに ODSファイル とは、 「表計算ソフトなどで作成・編集されるワークシートの標準ファイル形式の一つで、 Apache OpenOffice(旧OpenOffice.org)やLibreOfficeなどのオープンソースのオフィスソフトが既定のファイル形式として採用している。」 標準のファイル拡張子は「.ods」。
(『IT用語辞典 e-Words』より)123456789101112131415161718192021222324252627282930<?php
// ライブラリ読込
require
'../vendor/autoload.php'
;
// 利用クラスエイリアス
use
Box\Spout\Writer\Common\Creator\WriterEntityFactory;
// ODS書込クラス生成
$writer
= WriterEntityFactory::createODSWriter();
// 書込みファイル指定
$writer
->openToFile(
'test.ods'
);
// セルデータ
$cells
= [
WriterEntityFactory::createCell(
'A001'
),
WriterEntityFactory::createCell(
'B002'
),
WriterEntityFactory::createCell(
'C003'
),
];
// 行データ
$singleRow
= WriterEntityFactory::createRow(
$cells
);
// 行データを3行追加
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
$writer
->addRow(
$singleRow
);
// エクセルファイルの書込
$writer
->close();
?>
出力されたODSファイルを見てみると以下の様になります。 (ODSファイルはエクセルソフトでオープンできます)
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。