PhpSpreadsheetで発生するエラーをやっつける
#php #excel
PhpSpreadsheetをいろいろ試してみるの続き。
最初は写経ではじめるからエラーにぶつかることは少ないと思うけど、
こんなのをつくりたい!をやろうとするとまーぶつかるぶつかる。
ってことで、原因特定のコツみたいなのを残しておく。
エラーの種類
まずエラーを大きく二分する。
PHPでの実行時に発見できるエラー
Excelでのオープン時に発見できるエラー
上記は保存までに発生するエラーで、基本的にはセルの指定とかに起因するものだと思う。
後者は保存までの設定が抜けてたり異常値だったりする。
PHPでの実行時に発見できるエラー
簡単に言うとexception。
とはいえ、これがまーわかりにくい。
というか、何が問題かは分からない。
分かるのは、何かしらのセル指定に問題があるのは間違いない!くらい。
セル指定以外でも発生はすると思うけど、ミスが起こるのはセル指定が大半やと思う。
Exceptionメッセージは似たり寄ったりで参考にならなかったけど、ぶつかったエラーを残しておく。
シート名に記号が入ってるときのセル指定間違い
例えば、作業実績(12月)ってシートがあって、このシートの中のセルを使ってグラフを書きたいとする。
セル指定の基本的な形はシート名!セル名って感じ。でも、記号が入ってる場合は'シート名'!セル名にしなくてはいけない。
この辺にぶつからないように下記のような関数を作っておくと便利。
code:excel.php
private function getCellCoordinate(string $sheetName, int $col, int $row): string
{
$sheet = $this->spreadsheet->getSheetByName($sheetName);
return "'{$sheet->getCodeName()}'!{$sheet->getCellByColumnAndRow($col, $row)->getCoordinate()}";
}
private function getRangeCoordinate(string $sheetName, int $startCol, int $startRow, int $endCol, int $endRow): string
{
$sheet = $this->spreadsheet->getSheetByName($sheetName);
return "'{$sheet->getCodeName()}'!{$sheet->getCellByColumnAndRow($startCol, $startRow)->getCoordinate()}:{$sheet->getCellByColumnAndRow($endCol, $endRow)->getCoordinate()}";
}
シートを指定してはいけない設定
これは割とある感じがする。
例えばグラフを描くときの描画位置を指定するsetTopLeftCellとsetBottomRightPosition。
これはシートの位置を指定するとExceptionを吐く。
そのあとに実行するであろうaddChartによってシートを指定したいから?
分からないけど、こういう罠はままある。
Excelでのオープン時に発見できるエラー
これはExcelで開いた時点で修復されて問題が見えなくなる。
一応描画されてて、部分的に欠けてるのであればその設定を見直せばわかるけど、
まるまる描画されていないとなると何が原因か分からない。
部分的に描画されていない
僕が最初にはまったのは描画されてるけど描画位置がおかしいというもの。
表の下を指定して描画したのに、何故かA1からグラフがはじまるって感じ。
原因はsetTopLeftCellは指定してたけど、setBottomRightPositionが指定出来てなかった。
多分コピペしたときに消えちゃったんだと思う。
とにかくこういうのは設定したのに描画されてないぞ!を探ればいいから割と簡単。
全く描画されていない
修復なく描画されてないのであれば
$writer->setIncludeCharts(true); を追加すればいけるはず。
修復されて描画されない場合は、根本的なミスをしてるはずなので写経からやり直すくらいしか思いつかない……。
写経からやり直すと気づいたら問題は改善されてるけど、何が問題だったのかつかめないから成長できない。
これはほんとつらい。
おわりに
引き続きエラー退治の知見が増えたら追記していく。
#2021/01/24週
更新履歴
#2021/01/24 公開