PhpSpreadsheetでセルにパーセンテージの書式設定をしたい


タイトルのとおり。少しハマったので備忘録と、困ってる人が他にもいたら。
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はつらい。