前言
这几天突然发现网上没有给ppt插入图表的例子(或者是我没找到),找到的大部分都是根据现有的ppt图表区修改数据。
所以就简单弄了个柱状图的小demo
一、正文
1.依赖
用了5.2.2的poi
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
2.代码
纯手打,有啥错误多多理解
柱状图的数据,这里是创建了一个excel工作簿,也可以导入现有工作簿
// 创建一个工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 写入数据
XSSFSheet sheet = workbook.createSheet();
XSSFRow row0 = sheet.createRow(0);
row0.createCell(1).setCellValue("男");
row0.createCell(2).setCellValue("女");
for (int i = 0; i < 4; i++) {
// 设置每一行的字段标题和数据
XSSFRow row = sheet.createRow(i + 1);
row.createCell(0).setCellValue( (i+1) + "班");
row.createCell(1).setCellValue(3);
row.createCell(2).setCellValue(4);
}
excel的数据长这个样子,方便下面看
// 创建一个ppt
XMLSlideShow ppt = new XMLSlideShow();
// 创建了一个幻灯片 这就是个空白的幻灯片,没有背景啥的,需要的可以自行研究
XSLFSlide slide = ppt.createSlide();
// 创建一个图表
XSLFChart chart = ppt.createChart();
// 把工作簿放到图表里,这样可以方便文件更新
chart.setWorkbook(workbook);
// 图表头
chart.setTitleText("测试文本title");
//这个是生成图表底部的示例的
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.BOTTOM);
// x坐标轴 底部
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
// y轴 左侧
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
// 创建图表数据,第一个指定是什么图表 柱状图或者饼图,折线图都ok,
XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
// 底部类别的数据源,可以从数组读,也可以从指定一个excel范围
XDDFCategoryDataSource xddfCategoryDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet,new CellRangeAddress(1,4,0,0));
// 这是第一个柱状图的数据源
XDDFNumericalDataSource<Double> doubleXDDFNumericalDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 4, 1, 1));
// 这是第二个柱状图的数据源
XDDFNumericalDataSource<Double> doubleXDDFNumericalDataSource2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 4, 2, 2));
// 把第一组柱状图添加到图表数据里 返回一个系列数据
XDDFChartData.Series series = data.addSeries(xddfCategoryDataSource, doubleXDDFNumericalDataSource);
// 第二组
XDDFChartData.Series series1 = data.addSeries(xddfCategoryDataSource, doubleXDDFNumericalDataSource2);
// 设置第一个系列的名称 上面那个生成图表底部的示例的就是这里 ,第一个指定名称,第二个可以给一个单元格。两个参数可以有一个为null
series.setTitle("男", new CellReference(sheet.getRow(0).getCell(1)));
series1.setTitle("女", new CellReference(sheet.getRow(0).getCell(2)));
// 数据源转为barchart
XDDFBarChartData bar = (XDDFBarChartData) data;
// 这一句是y轴的一个操作,也没懂什么意思,但是没有这个,画的图表会超出画布范围
leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
// 是否设置不同的颜色 false就行
bar.setVaryColors(false);
// 柱状图的方向
bar.setBarDirection(BarDirection.COL);
// 柱状图的类型,不是有什么堆积。。。的
bar.setBarGrouping(BarGrouping.STANDARD);
// 可以设置间隙宽度
// bar.setGapWidth(200);
// 开始画图
chart.plot(data);
// ***一开始我生成的图总是在左上角一点点,我看了addChart源码 x:10,y:10,w:500000,h:500000
// 我就只能一点点加到了合适的差不多的参数,你们可以自己试试
Rectangle2D.Double rect = new Rectangle2D.Double(700000, 500000, 7000000, 5000000);
// 把柱状图加到幻灯片里,指定画布
slide.addChart(chart,rect);
ppt.write(new FileOutputStream("D://temp333.pptx"));
3.图例
ppt就长这个样子,柱状图的颜色什么的都是可以指定的,你们可以研究下哈