java读取doc、docx、ppt、pptx、xls、xlsx格式的文件

前言:

通常我们用apache 的POI库对以上文档进行操作,apache POI官网
apache POI官网
这里推荐到官网下载导入到项目,maven下载的它会缺少几个包。
格式上后缀带x(docx、pptx、xlsx)是不带x(doc、ppt、xls)的拓展,在体积更小,功能更强,安全性更高,如果用不带x格式强制打开带x格式的,可能会丢失少量数据,因此,poi在操作这俩类文件时,是用不同系列的包的,注意,文件本身是什么格式的,就是什么格式的,不可以去解析那些通过修改文件后缀名格式的文件( 比如原本你的文件是doc格式,你强制修改后缀为docx,那么这时你是无法用docx的包去解析该文件的)。

word文件读取

从下图中可以看到,如果用doc处理方法去处理docx文档,它会告诉你该文档本身是ooxml文档,即docx文档,无法处理

public static String readDoc(String path) throws Exception {
   StringBuffer content = new StringBuffer("");// 文档内容
   HWPFDocument doc = new HWPFDocument(new FileInputStream(path));
   Range range = doc.getRange();
   int paragraphCount = range.numParagraphs();// 段落
   for (int i = 0; i < paragraphCount; i++) {// 遍历段落读取数据
   Paragraph pp = range.getParagraph(i);
    content.append(pp.text());
   }
   return content.toString().trim();
   }

从下图中我们可以看到,用解析doc的包解析docx会报错,官方提示你可以用HSSF的包来解析docx,这里我们用另一高效的处理类(ooxml)来处理docx格式,当然,该类目前还不成熟和稳定。

 //docx格式,主要用ooxml包读取
 public static String readDocx(String path) throws Exception {
   XWPFDocument xdoc = new XWPFDocument(new FileInputStream(path));
   XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
   String doc1 = extractor.getText();
   return doc1;
}

PowerPoint文件读取

读取ppt 这里只简单读取一些文本内容,主要使用HSLFSlideShow、HSLFSlide 类


public static String readPPT(String path) throws Exception {
	/*//创建ppt文件
	HSLFSlideShow ppt = new HSLFSlideShow();
	//创建幻灯片
	HSLFSlide s1 =ppt.createSlide();
	
	FileOutputStream out = new FileOutputStream("D:\\slideshow.ppt");
	ppt.write(out);
	out.close();*/
	
	/*HSLFSlideShow ppt = new HSLFSlideShow(new 		   	 
	HSLFSlideShowImpl("slideshow.ppt"));
	//查看每张幻灯片大小
	java.awt.Dimension pgsize =ppt.getPageSize();
    int pgx = pgsize.width; //slide width
    int pgy = pgsize.height; //slide height
    //修改每张幻灯片大小
    ppt.setPageSize(new java.awt.Dimension(1024, 768));
    //保存
    FileOutputStream out = new FileOutputStream("slideshow.ppt");
    ppt.write(out);
    out.close();*/
	StringBuffer content = new StringBuffer("");// 文档内容
    HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(path));
    // 获取幻灯片
    for (HSLFSlide slide : ppt.getSlides()) {
    	//得到每张幻灯片中所有元素
        for (HSLFShape sh : slide.getShapes()){
            // 形状名称
            String name = sh.getShapeName();
            // 在这个幻灯片中的形状的锚位置
            Rectangle2D anchor = sh.getAnchor();
            if (sh instanceof Line) {
              	// 在行间
                Line line = (Line) sh;
                content.append(line.getText());
            } else if (sh instanceof HSLFAutoShape) {
             	// 在自动填充区域内
                HSLFAutoShape shape = (HSLFAutoShape) sh;
                content.append(shape.getShapeName());
            } else if (sh instanceof HSLFTextBox) {
            	// 在文本框中
                HSLFTextBox shape =(HSLFTextBox) sh;
                content.append(shape.getText());
            } else if (sh instanceof HSLFPictureShape) {
           		// 在图片中
                HSLFPictureShape shape =(HSLFPictureShape) sh;
                content.append(shape.getShapeName());
            }
        }
    }
	return content.toString();
}

pptx的格式原本是可以用XSLFPowerPointExtractor提取器读取的,但是现在该类已经被废弃了,因此我们使用XMLSlideShow、XSLFSlide 类来直接读取
需导入的额外导入的maven库:

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>28.0-jre</version>
</dependency>
public static String readPPTX(String path) throws Exception {
//创建一个新的空幻灯片
    XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(path));
    // 拼接字符串
    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();
}

excel文件读取

excel文件读写就比较容易了,这里不再赘述,可以参考这个人博客
excel文件读写

参考博客:
java读取txt/pdf/xls/xlsx/doc/docx/ppt/pptx
Java读取pptx

你可能感兴趣的:(java,java)