java poi 创建ppt图表,柱状图


前言

这几天突然发现网上没有给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就长这个样子,柱状图的颜色什么的都是可以指定的,你们可以研究下哈
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用Apache POI 3.7版本生成柱的步骤如下: 1.创建一个Workbook对象,表示整个Excel文件。 ``` Workbook wb = new HSSFWorkbook(); ``` 2.创建一个Sheet对象,表示Excel文件中的一个sheet。 ``` Sheet sheet = wb.createSheet("Sheet1"); ``` 3.创建一个Row对象,表示某个单元格所在行。 ``` Row row = sheet.createRow(0); ``` 4.创建一个Cell对象,表示一个单元格。 ``` Cell cell = row.createCell(0); ``` 5.设置单元格的值。 ``` cell.setCellValue("柱"); ``` 6.创建一个Drawing对象,用于绘制形。 ``` Drawing drawing = sheet.createDrawingPatriarch(); ``` 7.创建一个ClientAnchor对象,表示形在单元格中的位置和大小。 ``` ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); ``` 其中,(0, 0)表示形左上角在单元格(0,0)处,(0, 5)表示形右下角在单元格(5,10)处。 8.创建一个Chart对象,表示形。 ``` Chart chart = drawing.createChart(anchor); ``` 9.创建一个ChartLegend对象,表示例。 ``` ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.BOTTOM); ``` 10.创建一个BarChartData对象,表示柱的数据。 ``` BarChartData data = new BarChartDataBuilder() .setCategories(new String[]{"A", "B", "C"}) .addSeries("Series 1", new double[]{1, 2, 3}) .addSeries("Series 2", new double[]{2, 3, 4}) .build(); ``` 其中,setCategories方法设置X轴上的标签,addSeries方法添加数据系列。 11.创建一个ChartAxis对象,表示X轴。 ``` ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setMajorTickMark(AxisTickMark.NONE); ``` 12.创建一个ChartAxis对象,表示Y轴。 ``` ChartAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); ``` 13.创建一个BarChartSeries对象,表示柱的数据系列。 ``` BarChartSeries series1 = data.getSeries().get(0); BarChartSeries series2 = data.getSeries().get(1); ``` 14.创建一个BarChartSeriesRender对象,表示柱的样式。 ``` BarChartSeriesRender render1 = new BarChartSeriesRender(); render1.setFill(new SimpleSolidFill(Color.BLUE)); BarChartSeriesRender render2 = new BarChartSeriesRender(); render2.setFill(new SimpleSolidFill(Color.RED)); ``` 15.将数据系列和样式添加到形中。 ``` chart.plot(data, bottomAxis, leftAxis, render1, render2); ``` 完整的代码示例: ``` Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("柱"); Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); Chart chart = drawing.createChart(anchor); ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.BOTTOM); BarChartData data = new BarChartDataBuilder() .setCategories(new String[]{"A", "B", "C"}) .addSeries("Series 1", new double[]{1, 2, 3}) .addSeries("Series 2", new double[]{2, 3, 4}) .build(); ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setMajorTickMark(AxisTickMark.NONE); ChartAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); BarChartSeries series1 = data.getSeries().get(0); BarChartSeries series2 = data.getSeries().get(1); BarChartSeriesRender render1 = new BarChartSeriesRender(); render1.setFill(new SimpleSolidFill(Color.BLUE)); BarChartSeriesRender render2 = new BarChartSeriesRender(); render2.setFill(new SimpleSolidFill(Color.RED)); chart.plot(data, bottomAxis, leftAxis, render1, render2); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值