make is.dev make it simple. development.
2024年5月19日

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インスタンスにする必要がある。