动态插入数据,根据插入的数据生成Chart,用的Excel组件,Aspose.Cells for Java,https://apireference.aspose.com/cells/java
先看一下效果图
示例代码
我是需要用到报表模板
Workbook wb;
try {
// 读取jar中报表模板
ClassPathResource resource = new ClassPathResource("exportTemplate/" + templateName);
InputStream fis = resource.getInputStream();
wb = new Workbook(fis);
} catch (Exception e) {
throw new BaseException("读取报表模板失败!");
}
不需要直接
Workbook workbook = new Workbook();
往第一个sheet,插入点测试数据
Worksheet sheet = workbook.getWorksheets().get(0);
Cells cells = sheet.getCells();
cells.get(0, 1).putValue("Income");
cells.get(1, 0).putValue("3月10日");
cells.get(2, 0).putValue("3月11日");
cells.get(3, 0).putValue("3月12日");
cells.get(1, 1).putValue(22.322);
cells.get(2, 1).putValue(22.844);
cells.get(3, 1).putValue(23.499);
cells.get(1, 2).putValue(26.869);
cells.get(2, 2).putValue(26.636);
cells.get(3, 2).putValue(26.633);
cells.get(1, 3).putValue(1.64);
cells.get(2, 3).putValue(1.75);
cells.get(3, 3).putValue(1.62);
插入Chart
int chartIndex = sheet.getCharts().add(ChartType.LINE, 16, 0, 36, 8);
Chart chart = sheet.getCharts().get(chartIndex);
chart.getNSeries().add("B2:B4", true);
chart.getNSeries().add("C2:C4", true);
chart.getNSeries().add("D2:D4", true);
// chart.getNSeries().addR1C1("R[1]C[1]:R[3]C[2]", true);
chart.getNSeries().setCategoryData("A2:A4");
// Series aSeries = chart.getNSeries().get(0);
// aSeries.setName("=B1");
chart.setShowLegend(true);
chart.getTitle().setText("Income Analysis");
for (int i = 0; i < chart.getNSeries().getCount(); i++) {
//设置每条折线的名称
chart.getNSeries().get(i).setName("折线" + i);
//设置每个值坐标点的样式
Marker marker = chart.getNSeries().get(i).getMarker();
marker.setMarkerStyle(ChartMarkerType.AUTOMATIC);
marker.setMarkerSizePx(10);
}
// 设置右边坐标轴显示
chart.getSecondValueAxis().setVisible(true);
// 设置图例的位置
Legend legend = chart.getLegend();
legend.setPosition(LegendPositionType.BOTTOM);
legend.getBorder().setVisible(false);
chart.getPlotArea().getArea().setForegroundColor(Color.getTransparent());
保存
try {
workbook.save(reportPath);
} catch (Exception exception) {
}
2022年3月26日补充,坐标轴标题过长不能自动居中,暂时先手动设置位置,查阅官方文档,也没理解setX(),setY()啥意思到底
chart.getValueAxis().getTitle().setY(-200);
设置折线的颜色样式
Series series = chart.getNSeries().get(0);
series.getBorder().setColor(Color.fromArgb(68, 114, 196));
series.getBorder().setWeight(WeightType.MEDIUM_LINE);
设置坐标点颜色样式,这里如果MarkerStyle set的是AUTOMATIC,颜色样式设了就不起作用
// 设置每个值坐标点的样式
Marker marker = chart.getNSeries().get(0).getMarker();
marker.getBorder().setColor(Color.getBlack());
marker.getArea().setForegroundColor(Color.fromArgb(68, 114, 196));
marker.setMarkerStyle(ChartMarkerType.CIRCLE);
marker.setMarkerSizePx(10);