1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

タイトルのとおり。少しハマったので備忘録と、困ってる人が他にもいたら。
PHP8.0.8, PhpSpreadsheetのバージョンは1.18です。

はじめに

->setCellValue()すれば値の書き込みはできるんですが、デフォルトではすべてが文字列として埋め込まれるので、例えばstringの5.5%を埋め込むと、こういう警告が出ます。
スクリーンショット 2021-07-05 21.06.40.png

これを抑制するため、書式設定しつつ値を書き込みたい。

結論

どう書けばいいのかだけを知りたい方へ。
セルの場合はこう。
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

何をしてるのか

コードの意味を理解したい人へ。

スクリーンショット 2021-07-05 20.55.12.png

↑のようなユーザー定義の書式設定をコードでやっている感じ。セルを右クリックして「セルの書式設定」で出てくるやつですね。
getNumberFormat()でセルの書式設定オブジェクトを取得し、setFormatCode()で設定する。
PhpOffice\PhpSpreadsheet\Style\NumberFormatクラスに定義されてるコードはあくまでプリセットなので、自由にコードを設定できるはず。たぶん。

あんま凝りすぎると正規表現みたいに秘伝のタレ化しそうなので、なるべくNumberFormatクラスの定数で済ませましょう。

参考

この記事のおかげでgetNumberFormat()setFormatCode()の存在に気づけました。あざす!

さいごに

Excelはつらい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?