ようこそここは俺のチラシの裏だ。

専門学校卒のぽんこつえんじにあが個人事業主になって書いているただの日記。

【技術メモ】POIで一覧型帳票作ろうとしたら shiftRows メソッドがバグってた件。

概要

一般的に、帳票機能というと2種類に大別され、行・列が増減したりしない「単票形式」のものと、行・列がデータ数に応じて可変な「一覧形式」のものがありますね。

今回は後者の話。

事象

XSSFSheet#shiftRows メソッドを使うと、エラーは出ないが最終的に出来たExeclファイルが破損してしまう。

破損していても修復して何とか開けないこともないが、シフト基準位置移行のデータが狂っているようでデータが損失する。
シフト方向の正負とかに関わらないし、実験してみた感じ結合セルの有無や名前定義の有無、それらによるエラーは関係なさげ。

詳細

結論

POI4系 のバグらしい。

正確には、過去に検出・修正された既知のバグだったが、なんやかんやあって再発するようになったらしい。

http://apache-poi.1045710.n5.nabble.com/Bug-62711-New-Calling-shiftRows-corrupts-file-in-POI-4-0-td5731583.html

回避策

今の所、手っ取り早いのは POI3系 で最終バージョンの poi 3.17 を使えば事象が発生しないのは確認した。

修正版

は、まだリリースされてないけど、つい最近の 2019/07/01 に事象自体は修正されたとのこと、ありがてぇ、ありがてぇ。

http://apache-poi.1045710.n5.nabble.com/Bug-57423-shiftRows-produces-a-corrupted-xlsx-file-td5733740.html

http://apache-poi.1045710.n5.nabble.com/Bug-57423-shiftRows-produces-a-corrupted-xlsx-file-td5733741.html

はぇー、すっごいタイムリー。

次のバージョンでリリース乗ってくれれば最新版にすれば解決されそうだけど、現状はまだ無理っすね。

参考文献

57423 – shiftRows() produces a corrupted xlsx file