BlockRowRepeatParamParserのエラー(POI 3.11以降、BRの中にBRを記述した場合)

400 views
Skip to first unread message

seki

unread,
Jun 14, 2016, 12:13:47 AM6/14/16
to excella
関です。お世話になっております。

少し時間がとれるようになってきましたので、ExCella Reports 1.9 と POI 3.14 で既存のレポートの動作確認を行ってみました。
その結果、いくつかのレポートで以下のエラーが発生しました。

Caused by: java.lang.IllegalArgumentException: lastRow < firstRow || lastCol < firstCol
  at org
.apache.poi.ss.util.CellRangeAddress.<init>(CellRangeAddress.java:53)
  at org
.bbreak.excella.reports.tag.BlockRowRepeatParamParser.parse(BlockRowRepeatParamParser.java:411)
 
... 30 more

原因は以前の投稿と同様で、POI 3.11 で追加された CellRangeAddress のチェックに引っかかった為でした。
(POI 3.10.1 ではエラーは発生しません。)
発生位置はBlockRowRepeatParamParserの411行目でした。

ちなみにシンプルな繰返しのレポートならエラーは出ないのですが、以下のようにExcelテンプレートで
BRの中にBRを記述しているレポートの場合に上記エラーが発生するようです。

$BR[]{list,fromCell=1:0,toCell=4:16}
$BR
[]{subList,fromCell=1:0,toCell=1:16}

お手数をおかけしますが上記のケースでエラーにならないようにBlockRowRepeatParamParserの修正を検討していただけないでしょうか。
もしくは回避方法などございましたら教えていただけると助かります。
(今のところは POI 3.10.1 で問題ありませんので、対応は急がなくて大丈夫です。)

seki

unread,
Oct 17, 2016, 2:24:17 AM10/17/16
to excella
関です。お世話になっております。

以前投稿してから大分経ちましたが、検討状況はいかがでしょうか。
それで、こちらでも検討してみたのですが、BlockRowRepeatParamParserの410行目の以下のif文について、

// 子パーサによって縦に増えた分、子パーサのタグ位置より前の列にセルを挿入
if (defaultFromCellColIndex != result.getDefaultColumnIndex() && result.getRowIndex() > result.getDefaultRowIndex()) { //410行目
   
CellRangeAddress preRangeAddress = new CellRangeAddress(
            blockEndRowIndex
+ 1,
            blockEndRowIndex
+ (result.getRowIndex() - result.getDefaultRowIndex()),
            blockStartColIndex
,
            targetCol
- 1);

以下のように「&& targetCol > blockStartColIndex」を追加すれば回避できました。

// 子パーサによって縦に増えた分、子パーサのタグ位置より前の列にセルを挿入
if (defaultFromCellColIndex != result.getDefaultColumnIndex() && result.getRowIndex() > result.getDefaultRowIndex()
       
&& targetCol > blockStartColIndex //この行を追加
       
) {

new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) では、
3番目と4番目の引数の関係が「lastCol < firstCol」となる場合に IllegalArgumentException が発生します。
その為、予めif文に「&& targetCol > blockStartColIndex」と終了列が開始列より大きい場合、
と定義しておいても特に問題ないかと思います。(範囲が逆転している場合は処理不要なはずですので。)

お手数をおかけしますが BlockRowRepeatParamParser の上記の問題について対応をお願い致します。
(他に影響があるようでしたら別の対応方法でも構いません。)

2016年6月14日火曜日 13時13分47秒 UTC+9 seki:

神園和秀

unread,
Oct 17, 2016, 8:57:56 PM10/17/16
to excella
すみません、このところ本業の方が忙しく、手が付けられておりません。
落ち着いたら検証してみたいと思います。
情報ありがとうございます。

2016年10月17日月曜日 15時24分17秒 UTC+9 seki:

kamisono

unread,
Jan 21, 2017, 2:05:15 AM1/21/17
to excella
こちら、修正をmasterに反映しました。
上記でいただいた修正でよさそうでしたので、そのまま反映しております。
ありがとうございました。

2016年10月18日火曜日 9時57分56秒 UTC+9 神園和秀:

seki

unread,
Jan 30, 2017, 11:50:23 PM1/30/17
to excella
お忙しい中、対応ありがとうございました。
ExCella Reports 1.10 と POI 3.15 で試してみましたところ、無事エラー無しで出力できました。これで大丈夫です。

2017年1月21日土曜日 16時05分15秒 UTC+9 kamisono:
Reply all
Reply to author
Forward
0 new messages