OpenSpout tips #4
・ EXCELからの値の読み込み
使用環境
・ PHP 8.2.9
・ openspout/openspout version 4.24.0
EXCELからの値の読み込み例
<?php
require '../vendor/autoload.php';
use OpenSpout\Reader\XLSX\Reader as XLSXReader;
// Readerインスタンスを生成
$reader = new XLSXReader();
// ファイルを開く
$reader->open( './template.xlsx' );
// 元になるシートの内容を新しいファイルに転記していく
foreach ( $reader->getSheetIterator() as $sheetIndex => $sheet ) {
// 1シート目のデータを読み込む
if ( $sheetIndex === 1 ) {
// シート内の情報を1行ずつ読み込む
// $rowIndexは1始まり
foreach ( $sheet->getRowIterator() as $rowIndex => $row ) {
// 行内の1セルずつ読み込んで表示
// $cellIndexは0始まり
foreach ( $row->getCells() as $cellIndex => $cell ) {
echo $cell->getValue(), "\n";
}
}
}
}
// Readerインスタンスを閉じる
$reader->close();
PHP前提として、前のシートから順に、上の行から順に、読み込んでいくことしか出来ない。
例を挙げると、いきなり100行目だけ取得することは出来ず、99行順に読んで無視してから100行目を取得するという処理を組むことになる。
取得出来る値について
基本の取得方法
$cellValue = $cell->getValue();
PHP値の取得は基本的にcellインスタンスのgetValue()で行う。
EXCEL上でテキストなら文字列、数値なら数値で取得出来る。
ただし、式や日時情報の場合は注意が必要。
式が格納されているセル
式はその内容によって、以下の3つのケースに分かれる。
・式が文字列として取得出来るケース
・計算結果の値が取得出来るケース
・解釈出来ない式の場合で「ErrorCell」が返ってくるケース
計算結果の値が取得出来るケースでは、そもそもに式として認識されておらず、結果論的に計算結果が取れている(本来は式を返す必要がある所を、判定の不具合でそうなっているような?)。
また、「ErrorCell」が返ってくるケースでは式だと認識されてはいるが、式自体を取得出来ない。
意図的に計算結果を取得したい場合は、セルからの値の取得個所を以下のように変える。
(セルの型を判定して式だったらgetComputedValue()を、そうでなかったらgetValue()を使う)
// 行内の1セルずつ読み込んで表示
// $cellIndexは0始まり
foreach ( $row->getCells() as $cellIndex => $cell ) {
if ( get_class( $cell ) == 'OpenSpout\Common\Entity\Cell\FormulaCell' ) {
echo $cell->getComputedValue(), "\n";
} else {
echo $cell->getValue(), "\n";
}
}
PHP日時情報が格納されているセル
日時情報は数値データとして取得されるので扱いづらい。
(例:2024/05/19 → 45431)
シートの判定
上記例のように foreach() 内でシートのindexを取得して判定する他、以下の判定方法がある。
// シート名で判別
if ( $sheet->getName() === 'Sheet1' ) {
}
// シートのindexを取得して判別(foreachの際にindexを取得するのとほぼ同じ)
if ( $sheet->getIndex() === 1 ) {
}
PHP指定セルを取得
行を取得した後、cellの取得はforeachで回す以外にも、以下のようにセルの配列を取得して、指定セルの値だけを取得する方法がある。
// セル位置指定で値を取得する
$cells = $row->getCells();
$cellValue = $cells[2]->getValue();
PHP