说明
动态创建带有多个图表的Excel文件效果图:
一、分析
第一种:创建图表模板,在Excel模板里设置好图表,然后通过更新模板数值,最终刷新图表;(也包含刷新图标各项数据)
第二种:动态创建带有数值与图表的Excel
说明:第一种,有一定的局限性,就是Excel里的数值与图表的格式需要固定,只是对数值进行替换。实际开发过程中,很少有固定的格式,所以重点讲解第二种;
二、全动态导出Excel带有多个图表–》实现步骤
第一步:根据传入的数据集,生成数据表的表头与数据行,并返回创建画布XSSFDrawing
第二步:在画布里创建空图表XSSFChart
第三步:设置图表XSSFChart,比如:创建柱状图
第四步:生成导出Excel文件
1.根据传入的数据集,生成数据表的表头与数据行
创建数据源,就是创建列头,数据行以及样式等;
一个sheet对应一个画布,所有返回一个画布;
代码如下:
private XSSFDrawing createXSSFDrawingBuildDataSource(ExcelMoreDataSourceInput input) {
if (Objects.isNull(wb)) wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet(input.getSheetName());
// 创建数据源
drawTable(sheet, input.getTitleArr(), input.getFldNameArr(), input.getDataList());
// 创建一个画布
return sheet.createDrawingPatriarch();
}
2.在画布里创建空图表XSSFChart
在画布里创建空图表XSSFChart,设置第几行几列为图表(多个图表布局好即可)
代码如下:
/**
* 创建图表
*
* @param isPutOnRight 比如:当列数大于5时,把画布放在数组右边
* @param chartNum 创建第几个图表
*/
private XSSFChart createChart(XSSFDrawing drawing, int cols, int rows, boolean isPutOnRight, int chartNum) {
int colNum = 25;
ClientAnchor anchor;
if (isPutOnRight) {
anchor = drawing.createAnchor(0, 0, 0, 0, 1, rows + 2 + colNum * (chartNum - 1), cols + 15, rows + colNum * chartNums);
} else {
anchor = drawing.createAnchor(0, 0, 0, 0, cols + 1, 4 + colNum * (chartNum - 1), cols + 15, colNum * chartNums);
}
// 创建一个chart对象
return drawing.createChart(anchor);
}
3.设置图表XSSFChart
以制作柱状图为例:
1、确认哪些列作为图例项
2、设置横坐标,这里固定第一列为横坐标
3、设置数据区域范围
具体请看一下代码
代码如下:
/**
* 生成柱状图
*
* @param chart 图表
* @param group 柱状图类型(堆积,多组)
* @param fldNameArrIndex 数据列下标(用于Excel标识数据源区域)
* @param rows 数据行数
* @param sheetName sheet的名称
*/
private void drawBarChartMap(XSSFChart chart, STBarGrouping.Enum group, int[] fldNameArrIndex, int rows, String sheetName) {
CTChart ctChart = chart.getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
// 创建柱状图模型
CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
ctBarChart.getVaryColors().setVal(true);
// 设置图类型
ctBarChart.addNewGrouping().setVal(group);
ctBoolean.setVal(true