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();
前提として、前のシートから順に、上の行から順に、読み込んでいくことしか出来ない。
例を挙げると、いきなり100行目だけ取得することは出来ず、99行順に読んで無視してから100行目を取得するという処理を組むことになる。
取得出来る値について
基本の取得方法
$cellValue = $cell->getValue();値の取得は基本的に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";
                }
            }日時情報が格納されているセル
日時情報は数値データとして取得されるので扱いづらい。
(例:2024/05/19 → 45431)
シートの判定
上記例のように foreach() 内でシートのindexを取得して判定する他、以下の判定方法がある。
// シート名で判別
if ( $sheet->getName() === 'Sheet1' ) {
}
// シートのindexを取得して判別(foreachの際にindexを取得するのとほぼ同じ)
if ( $sheet->getIndex() === 1 ) {
}指定セルを取得
行を取得した後、cellの取得はforeachで回す以外にも、以下のようにセルの配列を取得して、指定セルの値だけを取得する方法がある。
// セル位置指定で値を取得する
$cells = $row->getCells();
$cellValue = $cells[2]->getValue();