2017-03-08 20 views
0

ヘッダーと1つのセルを持つクロスタブ要素を含む.jrxmlの非常に基本的なテンプレートがあります。動的列幅ジャスパーレポート

私は動的な列数を持っているので、クロス集計を使用しています。私はBeanからのパラメータとしてdatasourceを与えているので、レポート生成の直前にいくつかのカラムを知っています。私は、 "動的な"幅の列が必要です。

私は、既存のjrxmlを読み込み、レポート生成の直前に列数に基づいて列幅を修復しようとしています。

これまで、私はファイルをロードする方法を見つけました。そして、私は右のバンド(私はそれが常に第2のものです)と右の要素(dynamicCrosstab)を取得しています。私は列の幅を設定する方法を見つけることができません。

私の現在のコード:事前に任意の助け

JasperDesign template = JRXmlLoader.load("C:\\repos\\templateFile.jrxml"); 
JRBand[] bands = template.getAllBands(); 
//getting crosstab 
JRElement element = bands[1].getElementByKey("dynamicCrosstab"); 
if (element instanceof JRCrosstab) { 
    //missing code to get cells and set width 
} 
//compiling template before using it to generate report 
JasperCompileManager.compileReportToFile(template, "C:\\repos\\templateFile.jasper"); 

TNX。

+0

代わりに[DynamicJasper](http://dynamicjasper.com/)を検討してください。 –

答えて

0

これは素晴らしい解決策ではありませんが、機能します。

if (element instanceof JRDesignCrosstab) { 
     //repair cells 
     List<JRCrosstabCell> celice = ((JRDesignCrosstab) element).getCellsList(); 
     //repair content in cells 
     ((JRDesignCrosstabCell) celice.get(0)).setWidth(newWidth); 
     for (JRChild child : ((JRDesignCrosstabCell) celice.get(0)).getContents().getChildren()) { 
      if(child instanceof JRDesignTextField){ 
       ((JRDesignTextField) child).setWidth(newWidth); 
      } 
     } 
     //repair content in header 
     List<JRCrosstabColumnGroup> headerji = ((JRDesignCrosstab) element).getColumnGroupsList(); 
     for (JRChild child : ((JRDesignCellContents) headerji.get(0).getHeader()).getChildren()) { 
      ((JRDesignTextField) child).setWidth(newWidth); 
     } 
    }