将 Highcharts 图表添加到使用 Java API 生成的 JasperReport 模板
Adding Highcharts chart to JasperReport template generated with Java API
我们正在评估 JasperReports 的专业版。对于 POC,我们需要根据用户在 UI 上选择的列动态生成(使用 Java API)报告模板,包括报告底部的总计.我们正在使用 net.sf.jasperreports.*
库生成报告模板,对其进行编译并 运行。效果不错。
但是我们想在总计旁边添加一个图表,其中包含构成总计的每个值。我们找到了 jaspersoft/highcharts
jar,它似乎是可以使用的,但需要一个代码片段来了解如何将图表(JRDesign
图表元素)添加到报告带(JRBand
).
任何见解将不胜感激。
更新
参考 Jaspersoft Pro 对 Highcharts 的支持 here
通过 Java API 添加图表元素包括创建一个 JRDesignComponentElement
对象,该对象包装 com.jaspersoft.jasperreports.highcharts.charts.StandardChartComponent
实例,其中包含所有图表配置。
下面是一些示例代码,用于创建在摘要部分包含图表的报告。报告可以运行使用一个空数据源和一个或多个数据记录。
您当然需要调整代码以使用要显示的数据填充图表。您主要需要更改水平桶表达式和度量值表达式。
要编译代码,您需要在类路径中加入 jasperreports-highcharts jar(加上依赖项 - jasperreports-pro、jasperreports-license 等)。
JasperDesign report = new JasperDesign();
report.setName("chart");
JRDesignBand summary = new JRDesignBand();
summary.setHeight(300);
report.setSummary(summary);
JRDesignComponentElement chartElement = new JRDesignComponentElement();
chartElement.setX(0);
chartElement.setY(0);
chartElement.setWidth(500);
chartElement.setHeight(300);
chartElement.setComponentKey(HighchartsConstants.DEFAULT_COMPONENT_KEY);
StandardChartComponent chart = new StandardChartComponent();
chart.setType(ChartType.COLUMN_CHART);
StandardChartSetting defaultSetting = new StandardChartSetting();
defaultSetting.setName(HighchartsConstants.SETTING_NAME_DEFAULT);
//set a static String property
defaultSetting.addChartProperty(new StandardChartProperty("title.text",
"My chart title", null));
//set an expression based boolean property
defaultSetting.addChartProperty(new StandardChartProperty("plotOptions.series.dataLabels.enabled",
null, new JRDesignExpression("true")));
chart.addChartSetting(defaultSetting);
DesignMultiAxisData data = new DesignMultiAxisData();
DesignMultiAxisDataset dataset = new DesignMultiAxisDataset();
//this actually means feeding data to the chart on each record
dataset.setIncrementType(IncrementTypeEnum.NONE);
data.setDataset(dataset);
DesignDataAxis rowAxis = new DesignDataAxis();
rowAxis.setAxis(Axis.ROWS);
DesignDataAxisLevel level = new DesignDataAxisLevel();
level.setName("rows");
level.setLabelExpression(new JRDesignExpression("\"Rows\""));
DesignDataLevelBucket levelBucket = new DesignDataLevelBucket();
//expression that produces category values
levelBucket.setExpression(new JRDesignExpression("\"Row \" + $V{REPORT_COUNT}"));
level.setBucket(levelBucket);
rowAxis.addLevel(level);
data.addDataAxis(rowAxis);
DesignDataMeasure measure = new DesignDataMeasure();
measure.setName("measure");
measure.setLabelExpression(new JRDesignExpression("\"Data\""));
measure.setCalculation(CalculationEnum.NOTHING);
measure.setValueClassName("java.lang.Integer");
//expression that produces series values
measure.setValueExpression(new JRDesignExpression("$V{REPORT_COUNT}"));
data.addMeasure(measure);
chart.setMultiAxisData(data);
chartElement.setComponent(chart);
summary.addElement(chartElement);
我们正在评估 JasperReports 的专业版。对于 POC,我们需要根据用户在 UI 上选择的列动态生成(使用 Java API)报告模板,包括报告底部的总计.我们正在使用 net.sf.jasperreports.*
库生成报告模板,对其进行编译并 运行。效果不错。
但是我们想在总计旁边添加一个图表,其中包含构成总计的每个值。我们找到了 jaspersoft/highcharts
jar,它似乎是可以使用的,但需要一个代码片段来了解如何将图表(JRDesign
图表元素)添加到报告带(JRBand
).
任何见解将不胜感激。
更新 参考 Jaspersoft Pro 对 Highcharts 的支持 here
通过 Java API 添加图表元素包括创建一个 JRDesignComponentElement
对象,该对象包装 com.jaspersoft.jasperreports.highcharts.charts.StandardChartComponent
实例,其中包含所有图表配置。
下面是一些示例代码,用于创建在摘要部分包含图表的报告。报告可以运行使用一个空数据源和一个或多个数据记录。
您当然需要调整代码以使用要显示的数据填充图表。您主要需要更改水平桶表达式和度量值表达式。
要编译代码,您需要在类路径中加入 jasperreports-highcharts jar(加上依赖项 - jasperreports-pro、jasperreports-license 等)。
JasperDesign report = new JasperDesign();
report.setName("chart");
JRDesignBand summary = new JRDesignBand();
summary.setHeight(300);
report.setSummary(summary);
JRDesignComponentElement chartElement = new JRDesignComponentElement();
chartElement.setX(0);
chartElement.setY(0);
chartElement.setWidth(500);
chartElement.setHeight(300);
chartElement.setComponentKey(HighchartsConstants.DEFAULT_COMPONENT_KEY);
StandardChartComponent chart = new StandardChartComponent();
chart.setType(ChartType.COLUMN_CHART);
StandardChartSetting defaultSetting = new StandardChartSetting();
defaultSetting.setName(HighchartsConstants.SETTING_NAME_DEFAULT);
//set a static String property
defaultSetting.addChartProperty(new StandardChartProperty("title.text",
"My chart title", null));
//set an expression based boolean property
defaultSetting.addChartProperty(new StandardChartProperty("plotOptions.series.dataLabels.enabled",
null, new JRDesignExpression("true")));
chart.addChartSetting(defaultSetting);
DesignMultiAxisData data = new DesignMultiAxisData();
DesignMultiAxisDataset dataset = new DesignMultiAxisDataset();
//this actually means feeding data to the chart on each record
dataset.setIncrementType(IncrementTypeEnum.NONE);
data.setDataset(dataset);
DesignDataAxis rowAxis = new DesignDataAxis();
rowAxis.setAxis(Axis.ROWS);
DesignDataAxisLevel level = new DesignDataAxisLevel();
level.setName("rows");
level.setLabelExpression(new JRDesignExpression("\"Rows\""));
DesignDataLevelBucket levelBucket = new DesignDataLevelBucket();
//expression that produces category values
levelBucket.setExpression(new JRDesignExpression("\"Row \" + $V{REPORT_COUNT}"));
level.setBucket(levelBucket);
rowAxis.addLevel(level);
data.addDataAxis(rowAxis);
DesignDataMeasure measure = new DesignDataMeasure();
measure.setName("measure");
measure.setLabelExpression(new JRDesignExpression("\"Data\""));
measure.setCalculation(CalculationEnum.NOTHING);
measure.setValueClassName("java.lang.Integer");
//expression that produces series values
measure.setValueExpression(new JRDesignExpression("$V{REPORT_COUNT}"));
data.addMeasure(measure);
chart.setMultiAxisData(data);
chartElement.setComponent(chart);
summary.addElement(chartElement);