java如何生成PPT

步骤 1: 添加Apache POI依赖

首先,在项目的pom.xml文件中添加Apache POI的依赖项:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

步骤 2: 封装PPTGenerator工具类

创建PPT文件:

createNewPPT: 创建一个新的PPT文件并保存到指定路径。
使用try-with-resources语句确保文件流正确关闭。

添加幻灯片:

addSlide: 添加一个新的幻灯片,并设置标题。
检查标题占位符是否存在,并设置标题。

添加图表:

addChartToSlide: 向幻灯片中添加图表,支持柱状图和折线图。
创建Excel工作簿和工作表,填充数据。
根据图表类型创建相应的图表,并设置标题和图例。

创建柱状图和折线图:

createBarChart 和 createLineChart: 分别创建柱状图和折线图。
确保数据系列正确添加到图表中。

保存PPT文件:

save: 将PPT文件保存到磁盘上。
使用try-with-resources语句确保文件流正确关闭

代码片段:

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class PPTGenerator {

    private XMLSlideShow ppt;
    private int slideIndex = 0;

    public PPTGenerator() {
        this.ppt = new XMLSlideShow();
    }

    /**
     * 创建新的PPT文件
     * @param fileName 文件名
     */
    public void createNewPPT(String fileName) {
        try (FileOutputStream out = new FileOutputStream(fileName)) {
            ppt.write(out);
        } catch (IOException e) {
            throw new RuntimeException("Failed to create new PPT file", e);
        }
    }

    /**
     * 添加一个新幻灯片
     * @param title 幻灯片标题
     */
    public void addSlide(String title) {
        XSLFSlide slide = ppt.createSlide();
        XSLFTitle titleShape = slide.getLayout().getTitlePlaceholder();
        if (titleShape != null) {
            titleShape.setText(title);
        }
        slideIndex++;
    }

    /**
     * 向幻灯片中添加图表
     * @param chartType 图表类型
     * @param title 图表标题
     * @param xAxisLabel X轴标签
     * @param yAxisLabel Y轴标签
     * @param dataSeries 数据系列
     * @param categories 类别标签
     */
    public void addChartToSlide(ChartType chartType, String title, String xAxisLabel, String yAxisLabel,
                                DataSeries[] dataSeries, String... categories) {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Data");

        // 创建数据表格
        XSSFRow headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue(xAxisLabel);
        for (int i = 0; i < dataSeries.length; i++) {
            headerRow.createCell(i + 1).setCellValue(dataSeries[i].getName());
        }

        for (int i = 0; i < categories.length; i++) {
            XSSFRow row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(categories[i]);
            for (int j = 0; j < dataSeries.length; j++) {
                row.createCell(j + 1).setCellValue(dataSeries[j].getData()[i]);
            }
        }

        // 获取当前幻灯片
        XSLFSlide slide = ppt.getSlides()[slideIndex - 1];

        // 创建图表
        XSLFChart chart = slide.createChart(XSLFClientAnchor.A1, workbook, "rId1", 600, 400);
        switch (chartType) {
            case BAR:
                createBarChart(chart, title, xAxisLabel, yAxisLabel, dataSeries);
                break;
            case LINE:
                createLineChart(chart, title, xAxisLabel, yAxisLabel, dataSeries);
                break;
            default:
                throw new IllegalArgumentException("Unsupported chart type: " + chartType);
        }

        // 设置图表标题
        XSLFChartTitle chartTitle = chart.setTitle(title);
        chartTitle.setPosition(XSLFChartTitle.Position.NORTH);

        // 设置图例
        XSLFChartLegend legend = chart.getOrCreateLegend();
        legend.setPosition(XSLFChartLegend.Position.RIGHT);

        // 释放资源
        workbook.close();
    }

    private void createBarChart(XSLFChart chart, String title, String xAxisLabel, String yAxisLabel, DataSeries[] dataSeries) {
        XSLFLineChartData lineChartData = chart.getOrAddNewSeriesAxis().createData(XSLFLineChartData.class);
        for (DataSeries series : dataSeries) {
            XSLFLineSeries lineSeries = lineChartData.addSeries(xAxisLabel, xAxisLabel);
            lineSeries.setTitle(series.getName());
            for (double value : series.getData()) {
                lineSeries.addPoint(value);
            }
        }
    }

    private void createLineChart(XSLFChart chart, String title, String xAxisLabel, String yAxisLabel, DataSeries[] dataSeries) {
        XSLFLineChartData lineChartData = chart.getOrAddNewSeriesAxis().createData(XSLFLineChartData.class);
        for (DataSeries series : dataSeries) {
            XSLFLineSeries lineSeries = lineChartData.addSeries(xAxisLabel, xAxisLabel);
            lineSeries.setTitle(series.getName());
            for (double value : series.getData()) {
                lineSeries.addPoint(value);
            }
        }
    }

    /**
     * 保存PPT文件
     */
    public void save() {
        try (FileOutputStream out = new FileOutputStream("output.pptx")) {
            ppt.write(out);
        } catch (IOException e) {
            throw new RuntimeException("Failed to save PPT file", e);
        }
    }

    public static void main(String[] args) {
        PPTGenerator pptGen = new PPTGenerator();

        // 创建新的PPT
        pptGen.createNewPPT("test.pptx");

        // 添加一个新幻灯片
        pptGen.addSlide("Title Slide");

        // 准备数据系列
        DataSeries sales = new DataSeries("Sales", new double[]{100, 120, 150});
        DataSeries expenses = new DataSeries("Expenses", new double[]{70, 80, 90});

        // 创建一个柱状图
        pptGen.addChartToSlide(ChartType.BAR, "Financial Data", "Years", "Amount",
                               new DataSeries[]{sales, expenses}, "2018", "2019", "2020");

        // 创建一个折线图
        pptGen.addChartToSlide(ChartType.LINE, "Financial Data", "Years", "Amount",
                               new DataSeries[]{sales, expenses}, "2018", "2019", "2020");

        // 保存PPT
        pptGen.save();
    }
}

enum ChartType {
    BAR, LINE
}

class DataSeries {
    private String name;
    private double[] data;

    public DataSeries(String name, double[] data) {
        this.name = name;
        this.data = data;
    }

    public String getName() {
        return name;
    }

    public double[] getData() {
        return data;
    }
}

总结

以上代码实现了从创建PPT文件、添加幻灯片、插入图表到保存PPT文件的完整流程。每个步骤都有详细的注释和逻辑处理,确保代码的正确性和可读性。你可以根据实际需求进一步扩展或修改这个工具类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值