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