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

OpenSpout tips #1

OpenSpoutを使ってEXCELファイルを操作してみる。その初手。

・ 新たにEXCELファイルを作る
・ 既存のファイルを土台にEXCELファイルを作る(ファイルを開く+保存)

使用環境

・ PHP 8.2.9
・ openspout/openspout version 4.24.0

OpenSpoutのインストール

Composerを使ってOpenSpoutをインストールする。

composer require openspout/openspout

新たにEXCELファイルを作る

新しいEXCELファイルを作成するサンプル。

<?php

require '../vendor/autoload.php';

use OpenSpout\Writer\XLSX\Writer as XLSXWriter;


// Writerインスタンスを生成
$writer = new XLSXWriter();

// EXCELファイルを新たに作る(この時点でファイルが作られる)
$writer->openToFile( './output.xlsx' );


// ここで設定や値を書き込む


// Writerインスタンスを閉じる
$writer->close();
PHP

最後に保存するのではなく、随時ファイルが更新されるので注意。
また、最後のclose()時にも情報を書き込んでいる様子で、これがないとファイルが壊れる。

既存ファイルに加筆して別名保存

と、見出しを書いておいてなんだが、事実上これは出来ない。

近い内容としては、以下のようなもの。

<?php

require '../vendor/autoload.php';

use OpenSpout\Reader\XLSX\Reader as XLSXReader;
use OpenSpout\Writer\XLSX\Writer as XLSXWriter;


// Readerインスタンスを生成
$reader = new XLSXReader();

// 元になるファイルを開く
$reader->open( './template.xlsx' );


// Writerインスタンスを生成
$writer = new XLSXWriter();

// EXCELファイルを新たに作る(この時点でファイルが作られる)
$writer->openToFile( './output.xlsx' );


// 元になるシートの内容を新しいファイルに転記していく
foreach ( $reader->getSheetIterator() as $sheetIndex => $sheet ) {

    // 初期シート以外は新たにシートを追加する
    if ( $sheetIndex !== 1 ) {
        $writer->addNewSheetAndMakeItCurrent();
    }

    // シート内の情報を1行ずつ転記する
    foreach ( $sheet->getRowIterator() as $row ) {


        // ここで$rowを編集して設定や値を書き込む


        $writer->addRow( $row );
    }
}


// Writer、Readerインスタンスを閉じる
$writer->close();
$reader->close();
PHP

これは、既存ファイルから読み込んだデータを複写して新しいファイルを作っているにすぎない。

OpenSpoutはファイルの内容を全てメモリ上で扱わず、行単位で最小限の読み込み、出力を行っている。
そのため、大きいファイルを扱ってもメモリ使用量が少なく済む。

ただそのデメリットとして、ファイルを開いて一部を加筆して保存する、といった使い方は出来ない。

また、書式が維持出来ない。
(Readerから行データを取得する際、書式が取れない)

上記から、OpenSpoutはリストデータなどの、書式が重要視されず規模があるデータの取り込みや出力に長けている印象。
一方で、印刷用などの帳票作成には向かないように思われる。