是否可以使用Jasper Reports动态生成报告而不为每个报告生成jasper?

我必须根据动态提供的各种参数生成报告。 在某些上下文中,参数可以为空。 例如,从具有id姓名年龄性别婚姻状况的字段表中,我必须生成关于已婚男性30岁的报告。 在其他一些时候,可能需要在不考虑年龄的情况下结婚 。 如果我对这两种情况使用相同的jasper,则第二种情况下的年龄约束将为null。 有没有办法管理这种情况?

此外,是否可以动态指定报告中应生成哪些字段?

使用JasperReport API动态生成报告的示例:

//JasperDesign JasperDesign jasperDesign = new JasperDesign(); jasperDesign.setName("The dynamically generated report"); jasperDesign.setPageWidth(595); jasperDesign.setPageHeight(842); jasperDesign.setColumnWidth(515); jasperDesign.setColumnSpacing(0); jasperDesign.setLeftMargin(40); jasperDesign.setRightMargin(40); jasperDesign.setTopMargin(50); jasperDesign.setBottomMargin(50); //Query JRDesignQuery query = new JRDesignQuery(); query.setText("SELECT * FROM Address $P!{OrderByClause}"); jasperDesign.setQuery(query); //Fields JRDesignField field = new JRDesignField(); field.setName("Id"); field.setValueClass(java.lang.Integer.class); jasperDesign.addField(field); field = new JRDesignField(); field.setName("FirstName"); field.setValueClass(java.lang.String.class); jasperDesign.addField(field); field = new JRDesignField(); field.setName("LastName"); field.setValueClass(java.lang.String.class); jasperDesign.addField(field); //some code //Detail band = new JRDesignBand(); band.setHeight(40); JRDesignStaticText staticText = new JRDesignStaticText(); staticText.setX(0); staticText.setY(0); staticText.setWidth(60); staticText.setHeight(20); staticText.setMode(ModeEnum.OPAQUE); staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT); staticText.setStyle(boldStyle); staticText.setText("ID: "); staticText.getLineBox().getLeftPen().setLineWidth(1); staticText.getLineBox().getTopPen().setLineWidth(1); staticText.getLineBox().setLeftPadding(10); band.addElement(staticText); textField = new JRDesignTextField(); textField.setX(60); textField.setY(0); textField.setWidth(200); textField.setHeight(20); textField.setHorizontalAlignment(HorizontalAlignEnum.LEFT); textField.setStyle(normalStyle); expression = new JRDesignExpression(); expression.setValueClass(java.lang.Integer.class); expression.setText("$F{Id}"); textField.setExpression(expression); textField.getLineBox().getTopPen().setLineWidth(1); textField.getLineBox().getRightPen().setLineWidth(1); textField.getLineBox().setLeftPadding(10); band.addElement(textField); staticText = new JRDesignStaticText(); staticText.setX(0); staticText.setY(20); staticText.setWidth(60); staticText.setHeight(20); staticText.setMode(ModeEnum.OPAQUE); staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT); staticText.setStyle(boldStyle); staticText.setText("Name: "); staticText.getLineBox().getLeftPen().setLineWidth(1); staticText.getLineBox().getBottomPen().setLineWidth(1); staticText.getLineBox().setLeftPadding(10); band.addElement(staticText); textField = new JRDesignTextField(); textField.setStretchWithOverflow(true); textField.setX(60); textField.setY(20); textField.setWidth(200); textField.setHeight(20); textField.setPositionType(PositionTypeEnum.FLOAT); textField.setStyle(normalStyle); expression = new JRDesignExpression(); expression.setValueClass(java.lang.String.class); expression.setText("$F{FirstName} + \" \" + $F{LastName}"); textField.setExpression(expression); textField.getLineBox().getRightPen().setLineWidth(1); textField.getLineBox().getBottomPen().setLineWidth(1); textField.getLineBox().setLeftPadding(10); band.addElement(textField); ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band); 

您可以从JasperReports分发包中的%JasperReportsFolder%/ demo / samples文件夹中找到更多样本。

你应该尝试动态jasper。 这正是动态jasper设计的用例类型。 您可以使用相同的模板生成包含不同列的报告。

欲了解更多信息: http : //dynamicjasper.com/