【注意】 この記事は過去に別サイトで執筆したものを再掲載したものです。 内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。 |
jxlsではforEachタグで行や列をコピーして増やすことができる。
しかしその繰り返しの内部に条件分岐を含めると、少し問題がある。
<jx:forEach items="${items}" var="item">
<jx:if test="${item.sex == 'male'}">
男性の場合・・・
</jx:if>
<jx:if test="${item.sex == 'famale'}">
女性の場合・・・
</jx:if>
</jx:forEach>
挙動としては、男性なら男性の内容が、女性なら女性の内容が出力される。
出力されたExcelを見ると一見問題ないように見えるが、異様に多くの行数が生成されていることに気づく。
つまりこうゆうこと。
forEachタグはタグ内の行数×ループ数で事前に行を生成しているようなのだ。
でも実際は条件分岐により生成した行数よりも少ない行数が出力される。
結果、無駄な空行がたくさん作られることになる。と。
ループ数が少なかったり、条件分岐で出力する内容が1行くらいならまだ許容範囲だが、これが多くなってくるとExcel生成に異様に時間がかかるようになる。
パフォーマンス悪化を招くのでテンプレート作成時は考慮したい。