PhpSpreadsheetで書式設定を変更する時に躓いた話

PhpSpreadsheetでExcelを加工するプログラムを作っていた時に「特定のセルを結合して欲しい」「特定のセルの書式設定を変更して欲しい」という要望に苦戦したので覚書として残したいと思います。

1.特定のセルを結合して欲しい

後に書く書式設定についても同じなのですが、この「特定のセル」というのが厄介なことにテンプレートで一律に設定しておけるような条件ではありませんでした。

$sheet->mergeCells($target);

上記で$target(別途指定)で指定した範囲のセルを結合します。

例えば$target='A1:C3'であればA1からC3までの9個のセルを1つに結合します。

※但し、A1:C1、A2:C2、A3:C3でそれぞれ結合済みの場合は$target='A1:C3'としても結合されません。

手動でセルを結合する場合もA1:C1、A2:C2、A3:C3の結合を解除してからA1:C3で結合させるので当たり前の事かもしれませんが、なかなか気付けませんでした・・・。

2-1.特定のセルの書式設定を変更して欲しい(表示形式を数値→文字列に変更)

これについては結局変更する方法が分かりませんでした。

今回はテンプレートでは数値としておいて、phpで値を入力するセルは数値のまま、phpで値を入力しないセルだけ表示形式を文字列に変更して欲しいという要望でした。

「指定書式で値を入力する方法」というのは見つけましたが、値を入力せずに書式だけ設定しておくことはできないという事でした。

そこでテンプレートを文字列に変更して、phpで値を入力する時に数値として入力すればいいのでは?と思い試してみましたが表示形式は変わりませんでした。

これは表示形式を変えるのではなく、表示形式は数値のまま頭に「'」をつけて文字列として入力する行為に近いと考えて諦める事にしました。

2-2.特定のセルの書式設定を変更して欲しい(文字の配置を中央揃えに変更)

use PhpOffice\PhpSpreadsheet\Style\Alignment as Alignment;

$sheet->getStyle($target)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

上記で$target(別途指定)で指定したセルの文字の配置を中央揃えに変更できる・・・はずでした。

Excelを確認してみると確かに中央揃えに設定が変更されています。ですが、実際に値を入力すると中央寄せにならないのです。

結局のところこの点についてもセルの結合が問題でした。

特に必要ない結合でしたので、全て解除して試してみたところとある1列を除いて中央揃えになりました。

何故か1列だけは何か異なる設定がされている訳ではないのに中途半端に左に(左寄せよりは少し右に)寄る現象が解消できませんでしたが・・・。

まとめ

多少の疑問は残りましたが、とにかくセルの結合はできるだけ使わないようにするべきですね。

Excel難しい・・・。