OpenSpout tips #2
・ 文字、数値、式、ブランクの書き込み
・ 日付、日時の書き込み
使用環境
・ PHP 8.2.9
・ openspout/openspout version 4.24.0
基本例
新しいファイルを生成して値を書き込むサンプル。
<?php
require '../vendor/autoload.php';
use OpenSpout\Common\Entity\Row;
use OpenSpout\Common\Entity\Style\CellVerticalAlignment;
use OpenSpout\Common\Entity\Style\Style;
use OpenSpout\Writer\XLSX\Writer as XLSXWriter;
use OpenSpout\Writer\XLSX\Options;
// 書式設定の生成
$defaultStyle = new Style();
$defaultStyle->setFontName( 'Yu Gothic' ); // フォント
$defaultStyle->setFontSize( 11 ); // フォントサイズ
$defaultStyle->setCellVerticalAlignment( CellVerticalAlignment::CENTER ); // 縦中央寄せ
// オプション情報を生成し、上記で生成した書式を設定
$options = new Options();
$options->DEFAULT_ROW_STYLE = $defaultStyle;
// Writerインスタンスを上記オプションを指定して生成
$writer = new XLSXWriter( $options );
// EXCELファイルを新たに作る(この時点でファイルが作られる)
$writer->openToFile( './output.xlsx' );
// 行を書き込む
$row = Row::fromValues( [
'テキスト',
'12345',
12345,
'=1+1',
'=A1',
null,
new DateTime()
] );
$writer->addRow( $row );
// Writerインスタンスを閉じる
$writer->close();
PHP最低限の書式だけ指定して(指定しない場合はデフォルト設定で作られる)データを書き込んでいる。
書き込むデータは、セル毎に書式を指定しないのであれば配列で指定するのが楽。
文字、数値、式、ブランクの書き込み
// 行を書き込む
$row = Row::fromValues( [
'テキスト',
'12345',
12345,
'=1+1',
'=A1',
null,
] );
$writer->addRow( $row );
PHP文字列、数値、式の書き込みは、そのまま配列に値を入れれば良い。
数字は文字列として入れれば、文字列として書き込まれる。
ブランクセルを設けたい場合は、nullを含めればそこがブランクになる。
日付、日時の書き込み
// 行を書き込む
$row = Row::fromValues( [
new DateTime()
] );
$writer->addRow( $row );
PHP日付、日時はDateTime型のインスタンスを入れると、EXCELの日時データ(数値)に変換して書き込まれる。
ただし、上記では書式指定がないため、EXCELで開いた際に日時には見えない。
これを解消するには、以下のように書式を指定して書き込む必要がある。
<?php
require '../vendor/autoload.php';
use OpenSpout\Common\Entity\Cell;
( 中略 )
// 日時書式を作成する
$dateStyle = new Style();
$dateStyle->setFormat( 'yyyy/m/d h:mm' );
// 行を書き込む
$row = new Row([
Cell::fromValue( new DateTime(), $dateStyle ), // 日時書式付きで指定
Cell::fromValue( 'テキスト' )
]);
$writer->addRow( $row );
PHP行内の情報が全て日時であれば、 Row::fromValues() の第2引数でまとめて書式指定しても良い。
ただ、実利用では特定のセルのみ日時にするケースが多いと思われるので、上記例では行データをnewでインスタンスを生成する形に。
この場合、データ配列の中身はCellインスタンスにする必要がある。