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 );
PHPEXCELから値を取得する場合、書式や元データが値 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();
PHPgetFormattedValue() を使うと、書式が適用された結果を取得出来る。
(前述の getValue() の RichText オブジェクトの場合も装飾を無視して値を取得出来る)
また、式が格納されている場合は、式の計算結果に書式が適用されて返ってくる。
注意点として、数値データを取得する場合も文字列として返ってくるので、型には注意が必要。
値が何もない場合も、nullではなく空文字が返ってくる。
式の計算結果を取得
// 式の計算結果を取得
$a4 = $sheet->getCell('A4')->getOldCalculatedValue();
PHPgetOldCalculatedValue() を使うと、式の計算結果を取得出来る。
ただし、式ではないセルの値を取得しようとすると null が返ってくるので注意。
また、書式が適用されない点にも注意が必要。