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