前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习记录——Java读取pptx

学习记录——Java读取pptx

作者头像
润森
发布2019-10-09 14:25:41
2.2K0
发布2019-10-09 14:25:41
举报
文章被收录于专栏:毛利学Python

来源:极客时间

https://time.geekbang.org/course/detail/181-118098

需求要求
  • 读取pptx保存到md

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为"Poor Obfuscation Implementation"的首字母缩写,意为"可怜的模糊实现"。

环境
  • java8
  • maven
创建一个maven项目

在这里插入图片描述 使用apache接口

https://search.maven.org/artifact/org.lucee/poi/4.1.0/bundle

在这里插入图片描述

在pom.xml加入接口

在这里插入图片描述 可以类导入apache.poi.xslf

  • PPTXUtils.java

下面代码有些来源官网

代码语言:javascript
复制
package com.geekbang.ppttools;
// 导入org.apache.poi接口
import com.google.common.base.Splitter;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextShape;


import java.io.File;
import java.io.FileInputStream;


public class PPTXUtils {
    public static String getToc(File file) throws Exception {
        //创建一个新的空幻灯片
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));
        // 拼接字符串
        StringBuilder ret = new StringBuilder();
        // 第一张幻灯片
        XSLFSlide slide = ppt.getSlides().get(0);
        int currCha = -1;
        int count = 1;
        String title = null;
        boolean firstLine = true;

        for (XSLFShape shape : slide.getShapes()) {
            if (shape instanceof XSLFTextShape) {
                XSLFTextShape textShape = (XSLFTextShape) shape;
                String text = textShape.getText();
                try {
                    currCha = Integer.parseInt(text);
                    if (currCha >= 0 && title != null) {
                        ret.append("# ").append(currCha).append('.').append(title).append('\n');
                    }
                    continue;
                } catch (Exception ex) {
                }
                for (String line : Splitter.on("\n").omitEmptyStrings().trimResults().split(text)) {
                    if (firstLine) {
                        title = line;
                        firstLine = false;
                    } else {
                        ret.append(count).append(". ").append(line).append('\n');
                        count++;
                    }
                }
            }
        }
        return ret.toString();
    }
}
  • TOCGen.java
代码语言:javascript
复制
// 编译class对应的target路径
package com.geekbang.ppttools;
// 导入读取文件的模块
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
// 编码
import java.nio.charset.StandardCharsets;

public class TOCGen {
    public static void main(String[] args) throws Exception {
        // toc 所在pptx的路径
        String toc = genTocFromPPTX("D:\\学习资料\\极客时间\\java\\LetsJava\\第六章 Java 编程实战\\06. 一个从 pptx 文件中抽取文字的小工具\\code\\src\\main\\resources\\ppts");
        // new输出一个toc.md 编码utf-8的PrintWriter对象pw
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("toc.md"), StandardCharsets.UTF_8));

        pw.println(toc);
        pw.flush();
        pw.close();
        System.out.println("读取完成");
    }
    // 定义genTocFromPPTX方法  s 参数pptx的路径
    private static String genTocFromPPTX(String s) throws Exception {

        File rootDir = new File(s);
        // new一个StringBuilder
        StringBuilder ret = new StringBuilder("# 0.自我介绍\n\n");
        // 遍历路径的pptx
        for (File pptx : rootDir.listFiles()) {
            if (isThePPT(pptx)) {
                // 调用PPTXUtils类的getToc方法
                ret.append('\n').append(PPTXUtils.getToc(pptx)).append('\n');
            }
        }
        return ret.toString();
    }

    // 定义isThePPT方法
    private static boolean isThePPT(File pptx) {
        String pptxName = pptx.getName();
        if (!pptxName.endsWith("pptx")) {
            return false;
        }
        for (char ch : pptxName.substring(0, pptxName.indexOf('.')).toCharArray()) {
            if (!Character.isDigit(ch)) {
                return false;
            }
        }
        return true;
    }

}

代码链接:

https://github.com/geektime-geekbang/LetsJava

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求要求
  • 环境
  • 创建一个maven项目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档