引言

java poi操作ppt,对ppt进行读写操作

1. 处理pptx格式

pptx格式需要使用XMLSlideShow处理

  • DealPptX.java
    入口函数
@SpringBootTest
public class DealPptX {

    @Autowired
    private TextTranslationService textTranslationService;

    @Test
    public void main() throws IOException {
        System.out.println("----------单元测试开始----------");

        dealPptX("D:\\Users\\lvxy\\Desktop\\1.pptx","D:\\Users\\lvxy\\Desktop\\deal1.pptx");

        System.out.println("----------单元测试结束----------");
    }

    /**
     * 处理pptX文件
     * @param inputFilePath
     * @param outputFilePath
     * @throws IOException
     *  XMLSlideShow处理pttx
     * 注意:单一文本框中的所有文字视为同一段落,文本框内不同行用 \n 分割。
     *      文本框内分段使用 \n,在这里每个文本框视为同一段落,进行整体翻译,
     *      所以双语对照时,跟随翻译结果进行对照,故无法进行文本框内分段对照
     */
    public void dealPptX(String inputFilePath, String outputFilePath) throws IOException {

        FileInputStream inputStream = new FileInputStream(inputFilePath);
        FileOutputStream outputStream = new FileOutputStream(outputFilePath);

        XMLSlideShow xss = new XMLSlideShow(inputStream);

        //得到幻灯片的集合,每一个XSLFSlide代表一页幻灯片的对象
        List<XSLFSlide> pages = xss.getSlides();

        int index = 0;

        // 遍历每一张幻灯片
        for (XSLFSlide slide : pages) {
            // 计数
            index++;

            // 获得单张幻灯片内的各种对象 (包括但不限于文本框)
            // XSLFSlide.getShapes()得到XSLFShape对象,这个对象是单页幻灯片内所有对象的父类
            for (XSLFShape shape : slide.getShapes()) {

                if(ObjectUtil.isNull(shape)){
                    continue;
                }

                // 判断 当前对象是否为文本对象 XSLFTextShape
                // 每一个XSLFTextShape代表一个文本框对象
                if (shape instanceof XSLFTextShape) {
                    // 向下转型 XSLFTextShape 获得文本
                    String text = ((XSLFTextShape) shape).getText();
                    if(StrUtil.isNotEmpty(text)){
                        // 获取翻译结果翻译
                        String tgt_text = doTrans(text);
                        if(StrUtil.isNotEmpty(tgt_text)){
                            // 清空之前的文本
                            // ((XSLFTextShape) shape).clearText();
                            // 添加翻译后的文本
                            // 等同=((XSLFTextShape) shape).setText("\n"+tgt_text);
                            ((XSLFTextShape) shape).appendText("\n"+tgt_text,false);
                        }
                    }
                }
                // 判断 当前对象是否为表格对象 XSLFTable
                //每一个XSLFTable代表一个表格对象
                if (shape instanceof XSLFTable) {
                    // 向下转型为XSLFTable对象 一个表格对象
                    // 遍历行
                    for (XSLFTableRow row : ((XSLFTable) shape).getRows()) {
                        // 遍历单元格
                        for (XSLFTableCell cell : row.getCells()) {
                            // 获得文本
                            String text = cell.getText();
                            if(StrUtil.isNotEmpty(text)){
                                String tgt_text = doTrans(text);
                                cell.clearText();
                                cell.setText(text+"\n"+tgt_text);
                            }
                        }
                    }
                }
            }
        }
        xss.write(outputStream);
    }

    public String doTrans(String text){
        TranslationParamsBo paramsBo = new TranslationParamsBo();
        paramsBo.setFrom("zh");
        paramsBo.setSrc_text(text);
        paramsBo.setTo("en");
        try {
            // 令qps小于3
            Thread.sleep(400);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return textTranslationService.textTranslation(paramsBo).getData().getTgt_text();
    }

}


}

2. 处理ppt格式

ppt格式需要使用HSLFSlideShow处理

  • DealPpt.java
    入口函数
@SpringBootTest
public class DealPpt {

    @Autowired
    private TextTranslationService textTranslationService;

    @Test
    public void main() throws IOException {
        System.out.println("----------单元测试开始----------");

        dealPpt("D:\\Users\\lvxy\\Desktop\\11.ppt","D:\\Users\\lvxy\\Desktop\\deal11.ppt");

        System.out.println("----------单元测试结束----------");
    }

    @Test
    public void test() throws IOException {
        System.out.println("----------单元测试开始----------");

        String str = "dasdasd\nsad adasd \n";
        System.out.println(str);
        String s = null;
        if (str.endsWith("\n")){
            s = StrUtil.removeSuffix(str, "\n");
        }

        System.out.println(s);
        System.out.println("----------单元测试结束----------");
    }
    /**
     * 处理ppt文件
     * @param inputFilePath
     * @param outputFilePath
     * @throws IOException
     *  XMLSlideShow处理pttx
     * 注意:单一文本框中的所有文字视为同一段落,文本框内不同行用 \n 分割。
     *      文本框内分段使用 \n,在这里每个文本框视为同一段落,进行整体翻译,
     *      所以双语对照时,跟随翻译结果进行对照,故无法进行文本框内分段对照
     */
    public void dealPpt(String inputFilePath, String outputFilePath) throws IOException {

        FileInputStream inputStream = new FileInputStream(inputFilePath);
        FileOutputStream outputStream = new FileOutputStream(outputFilePath);

        HSLFSlideShow hss = new HSLFSlideShow(inputStream);

        //得到幻灯片的集合,每一个XSLFSlide代表一页幻灯片的对象
        List<HSLFSlide> pages = hss.getSlides();

        int index = 0;

        // 遍历每一张幻灯片
        for (HSLFSlide slide : pages) {
            // 计数
            index++;

            // 获得单张幻灯片具体的内容 (包括但不限于文本框)
            // HSLFShape.getShapes()得到XSLFShape对象,这个对象是单页幻灯片内所有对象的父类
            for (HSLFShape shape : slide.getShapes()) {

                if(ObjectUtil.isNull(shape)){
                    continue;
                }
                // 判断 当前对象是否为文本对象 HSLFTextShape
                // 每一个HSLFTextShape代表一个文本框对象
                if (ObjectUtil.isNotNull(shape) && shape instanceof HSLFTextShape) {
                    // 向下转型 HSLFTextShape 获得文本
                    String text = ((HSLFTextShape) shape).getText();
                    if(ObjectUtil.isNotNull(shape) && StrUtil.isNotEmpty(text)){
                        // 获取翻译结果
                        String tgt_text = doTrans(text);
                        if(StrUtil.isNotEmpty(tgt_text)){
                            // 添加翻译后的文本
                            ((HSLFTextShape) shape).setText(text+"\n"+tgt_text);
                        }
                    }
                }

                /**
                 * 判断 当前对象是否为表格对象
                 * 每一个XSLFTable代表一个表格对象
                 * ppt格式比较原始,所以根据行列坐标进行遍历
                 */
                if (ObjectUtil.isNotNull(shape) && shape instanceof HSLFTable) {
                    //遍历单元格行
                    for (int i = 0; i < ((HSLFTable) shape).getNumberOfRows(); i++) {
                        // 遍历单元格列
                        for (int j = 0; j < ((HSLFTable) shape).getNumberOfColumns(); j++) {
                            // 根据行列坐标取单元格
                            HSLFTableCell cell = ((HSLFTable) shape).getCell(i, j);

                            if(ObjectUtil.isNull(cell)){
                                continue;
                            }
                            String text = cell.getText();
                            // 获取翻译结果翻译
                            String tgt_text = doTrans(text);
                            if(StrUtil.isNotEmpty(tgt_text)){
                                // 去除翻译结束的尾缀 \r\n
                                if (tgt_text.endsWith("\r\n")){
                                    tgt_text = StrUtil.removeSuffix(tgt_text,"\r\n");
                                }
                                // todo 双语对照
                                cell.setText(text+"\n"+tgt_text);
                            }
                        }
                    }
                }
            }
        }
        hss.write(outputStream);
    }

    public String doTrans(String text){
        TranslationParamsBo paramsBo = new TranslationParamsBo();
        paramsBo.setFrom("zh");
        paramsBo.setSrc_text(text);
        paramsBo.setTo("en");
        try {
            // 令qps小于3
            Thread.sleep(400);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return textTranslationService.textTranslation(paramsBo).getData().getTgt_text();
    }

}