带有jasper报告的动态列宽

时间:2017-03-08 15:53:11

标签: java jasper-reports

我在.jrxml中有一个非常基本的模板,它包含带有标题和一个单元格的交叉表元素。

我正在使用交叉表,因为我有动态列数。我从bean提供datasource作为参数,所以我在报告生成之前就知道了很多列。我想要"动态"宽度。

我正在尝试读取现有的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提前获得任何帮助。

1 个答案:

答案 0 :(得分: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);
        }
    }