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

PhpSpreadsheet tips #4

・ EXCELからの値の読み込み
・ 値の取得
・ 書式適用後の値を取得
・ 式の計算結果を取得

使用環境

・ PHP 8.2.9
・ phpoffice/phpspreadsheet version 2.0.0 (Composerでインストール済み)

基本例

EXCELファイルを開いて値を取得するサンプル。

<?php

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

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;


// 元になるファイルをスプレッドシートに読み込む
$reader = new XlsxReader();

// ファイルを読み込み
$spreadsheet = $reader->load( './input.xlsx' );

// シート「Sheet1」を取得
$sheet = $spreadsheet->getSheetByName( 'Sheet1' );


// 値を取得
$a1 = $sheet->getCell('A1')->getValue();

// 値を取得(文字列の取得、かつ、文字装飾がある場合)
$a2 = $sheet->getCell('A2')->getValue()->getPlainText();

// 書式適用後の値を取得
$a3 = $sheet->getCell('A3')->getFormattedValue();

// 式の計算結果を取得
$a4 = $sheet->getCell('A4')->getOldCalculatedValue();


// 取得結果を出力
var_dump( [ $a1, $a2, $a3, $a4 ] );

// スプレッドシートを閉じてメモリを解放
$spreadsheet->disconnectWorksheets();
unset( $spreadsheet );
PHP

EXCELから値を取得する場合、書式や元データが値 or 式なのか、を意識する必要がある。

値を取得

// 値を取得
$a1 = $sheet->getCell('A1')->getValue();

// 値を取得(文字列の取得、かつ、文字装飾がある場合)
$a2 = $sheet->getCell('A2')->getValue()->getPlainText();
PHP

値の取得は getValue() で取得出来るが、いくつか注意が必要。

セルに格納されている情報が装飾付きの文字列の場合、 RichText オブジェクトが返ってくるケースがある。
その場合、取得したオブジェクトからさらに getPlainText() を実行してやる必要がある。

事前にどちらか分からない場合は、getValue() の後で以下のようにRichTextを判別して取得しても良い。

$a2 = $sheet->getCell('A2')->getValue();
if ( $a2 instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText ) {
	$a2 = $a2->getPlainText();
}
PHP

また、getValue() は、式が格納されている場合は式の内容が文字列で取得される。

また、値の場合も書式が適用されない点に注意が必要。
例えば、日付情報でEXCEL上では「2024年5月1日」と見えていても、上記で取得すると「45413」が返ってくる。
(PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp() を使って数値情報から変換かけていくことは可能だが、時差を考える必要があるなど少々工程がかかる)

式の計算結果や書式が適用された後の値を取得するには、以下を使う必要がある。

書式適用後の値を取得

// 書式適用後の値を取得
$a3 = $sheet->getCell('A3')->getFormattedValue();
PHP

getFormattedValue() を使うと、書式が適用された結果を取得出来る。
(前述の getValue() の RichText オブジェクトの場合も装飾を無視して値を取得出来る)

また、式が格納されている場合は、式の計算結果に書式が適用されて返ってくる。

注意点として、数値データを取得する場合も文字列として返ってくるので、型には注意が必要。

値が何もない場合も、nullではなく空文字が返ってくる。

式の計算結果を取得

// 式の計算結果を取得
$a4 = $sheet->getCell('A4')->getOldCalculatedValue();
PHP

getOldCalculatedValue() を使うと、式の計算結果を取得出来る。

ただし、式ではないセルの値を取得しようとすると null が返ってくるので注意。

また、書式が適用されない点にも注意が必要。