2017-03-08 140 views
0

我有一個相當基本的模板.jrxml其中包含交叉表元素與標題和一個單元格。動態列寬與碧玉報告

我使用交叉表,因爲我有動態列數。我將數據源作爲bean的參數,所以我知道報告生成之前的許多列。我想要「動態」寬度的列。

我想讀取現有的jrxml,然後根據報表生成之前的列數修復列寬。

直到現在我發現如何加載文件,並且我得到正確的樂隊(我知道它總是第二)和正確的元素(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); 
     } 
    }