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

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