jxls – こみなのメモ帳 / 趣味と実益のネタ帳 Fri, 13 Nov 2020 09:00:07 +0000 ja hourly 1 https://wordpress.org/?v=6.1.1 [jxls]forEachタグ内の条件分岐 /archives/560/ /archives/560/#respond Fri, 13 Nov 2020 09:00:07 +0000 https://www.komina.info/?p=560
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

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生成に異様に時間がかかるようになる。

パフォーマンス悪化を招くのでテンプレート作成時は考慮したい。

]]>
/archives/560/feed/ 0
[jxls][poi]列の表示/非表示 /archives/558/ /archives/558/#respond Thu, 12 Nov 2020 09:00:03 +0000 https://www.komina.info/?p=558
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

poiで列の表示/非表示を行う場合は、シートオブジェクトのsetColumnHidden()メソッドを用いる。

第一引数は対象の列番号。0から数える。
第二引数はBool値で、真なら非表示、偽なら表示。

jxlsで動的に非表示にするのであればセルの中に次のように書く。

${sheet.setColumnHidden(29,true)}
]]>
/archives/558/feed/ 0