タイトルのとおり。少しハマったので備忘録と、困ってる人が他にもいたら。
PHP8.0.8
, PhpSpreadsheetのバージョンは1.18
です。
はじめに
->setCellValue()
すれば値の書き込みはできるんですが、デフォルトではすべてが文字列として埋め込まれるので、例えばstringの5.5%
を埋め込むと、こういう警告が出ます。
これを抑制するため、書式設定しつつ値を書き込みたい。
結論
どう書けばいいのかだけを知りたい方へ。
セルの場合はこう。
setCellValue()
の第2引数は* 100
とかせず、小数のまま渡しましょう。
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class ExcelService {
public function writePercentageInSheet(Worksheet $sheet): void
{
$sheet->getStyle('A1')
->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_PERCENTAGE_00); // 0.00%
$sheet->setCellValue('A1', 0.582); // 58.2%
}
}
公式ドキュメントにもレシピがあった。解決後に気づいた。
https://phpspreadsheet.readthedocs.io/en/latest/topics/recipes/#number-formats
何をしてるのか
コードの意味を理解したい人へ。
↑のようなユーザー定義の書式設定をコードでやっている感じ。セルを右クリックして「セルの書式設定」で出てくるやつですね。
getNumberFormat()
でセルの書式設定オブジェクトを取得し、setFormatCode()
で設定する。
PhpOffice\PhpSpreadsheet\Style\NumberFormat
クラスに定義されてるコードはあくまでプリセットなので、自由にコードを設定できるはず。たぶん。
あんま凝りすぎると正規表現みたいに秘伝のタレ化しそうなので、なるべくNumberFormat
クラスの定数で済ませましょう。
参考
この記事のおかげでgetNumberFormat()
やsetFormatCode()
の存在に気づけました。あざす!
さいごに
Excelはつらい。