1.pom依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><!--处理2007 excel--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><!-- 用于处理当前的word文档2007的老版本 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.1</version></dependency>

这里需要注意:老版本的word是doc结尾,新版本的word是docx结尾,如果出现这个异常:org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)j就表示当前解析的版本不对需要使用老版本的word解析器

2.创建word文档

1.创建test.doc和test.docx文档,并且写入以下内容:

3.创建通用的解析方法用于解析当前的word文档

由于当前的docx和doc的类不兼容没有统一的接口所以需要区别对待

public void handlerWordFile(File file) throws Exception  {String fileName = file.getName();int lastIndexOf =fileName .lastIndexOf(".");if(lastIndexOf==-1) {throw new IllegalArgumentException("当前传入的文件格式不合法!");}String suffex=fileName.substring(lastIndexOf+1,fileName.length());try (InputStream is=new FileInputStream(file)){switch (suffex) {case "doc":handlerByDocFile(is);break;case "docx":handlerByDocxFile(is);break;default:throw new IllegalArgumentException("不能解析的文档类型,请输入正确的word文档类型的文件!");}}catch (Exception e) {throw e;}}

4.创建解析docx的方法

通过XWPFDocument对象可以解析word文档(docx)

public void handlerByDocxFile(InputStream is) throws IOException, InvalidFormatException {       XWPFDocument xwpfDocument = new XWPFDocument(is);Iterator<IBodyElement> bodyElementsIterator = xwpfDocument.getBodyElementsIterator();List<Object> datas=new ArrayList<>();while (bodyElementsIterator.hasNext()) {IBodyElement bodyElement = bodyElementsIterator.next();String content = handlerByBodyType(bodyElement,bodyElement.getPartType());datas.add(content);}xwpfDocument.close();is.close();printAllDatas(datas);}public void printAllDatas(Collection<?> datas) {System.out.println(datas);}//开始处理当前的身体元素public String handlerByIBodyElement(IBodyElement bodyElement) {String content=null;//用于处理XWPFParagraphif(bodyElement instanceof XWPFParagraph) {System.out.println("当前获取的元素类型为:XWPFParagraph");content=handlerXWPFParagraphType(bodyElement);}return content;}//用于处理当前的XWPFParagraph类型的数据public String handlerXWPFParagraphType(IBodyElement bodyElement) {XWPFParagraph xwpfParagraph = (XWPFParagraph) bodyElement;BodyElementType elementType = xwpfParagraph.getElementType();String content = getStringByBodyElementType(xwpfParagraph,elementType);System.out.println("当前文本的内容为:"+content);return content;}//通过当前的类型和元素进行相对应的处理public String getStringByBodyElementType(XWPFParagraph xwpfParagraph,BodyElementType bodyElementType) {System.out.println(bodyElementType);//当前测试结果为:PARAGRAPHString content="";switch (bodyElementType) {case CONTENTCONTROL://如果使用的是文本控件break;case PARAGRAPH://如果是段落的处理结果content=xwpfParagraph.getParagraphText();break;case TABLE://如果当前的的元素部分为表格break;default:break;}return content;}//通过身体类型来处理public String handlerByBodyType(IBodyElement bodyElement ,BodyType partType) {System.out.println("当前的BodyType为:"+partType);String content=null;switch (partType) {case CONTENTCONTROL:break;case DOCUMENT:content=handlerByIBodyElement(bodyElement);break;case HEADER:break;case FOOTER:break;case FOOTNOTE:break;case TABLECELL:break;default:throw new IllegalArgumentException("there is no this document type !please check this type!");}return content;}

5.测试解析后的test.docx

 public static void main(String[] args) throws Exception {WordTest test=new WordTest();URL resource = Thread.currentThread().getContextClassLoader().getResource("test.docx");File file=new File(resource.getFile());test.handlerWordFile(file);}

执行的结果为:

6.创建解析doc文档的方法

解析doc文件需要使用HWPFDocument这个类

 public void handlerByDocFile(InputStream is) {String content=null;HWPFDocument hwpfDocument=null;try {hwpfDocument=new HWPFDocument(is);content=getAllDocText(hwpfDocument);            } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {closeDocFile(hwpfDocument);}System.out.println(content);}//用于获取当前的doc word文档中的所有的内容public String getAllDocText(HWPFDocument hwpfDocument) {return hwpfDocument.getDocumentText();//这里也可以通过range获取数据}public void closeDocFile(HWPFDocument hwpfDocument) {try {if(hwpfDocument!=null)hwpfDocument.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

可以直接通过HWPFDocument .getDocumentText()获取当前word文档中的所有的文本内容!

结果为:

发现解析后的内容出现了[?]这几个字符,存在缺点

7.总结

1.使用poi解析docx和doc的时候注意当前的版本和类是不兼容的所以需要单独处理,解析docx需要使用XWPFDocument,而解析doc需要使用HWPFDocument

2.使用老版本的很容易就可以解析到当前word的所有文本内容,而新版本的需要通过判断和当前的类型才能获取数据新版本的不会出现[?]这个问题

以上纯属个人见解,如有问题请联系本人!

WORD解析:使用poi解析doc和docx相关推荐

  1. java读取docx_java使用poi读取doc和docx文件

    maven构建的项目-->pom.xml文件 eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包: ...

  2. java 读取 doc_java使用poi读取doc和docx文件的实现示例

    这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码. 我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码. 于 ...

  3. poi获取段落位置_java poi读取.doc和.docx文件时获取图片与段落的对应关系

    .doc文件 代码中的WordParagraph类是自己创建的实体类,用于记录文本信息和图片 file_word对象为前台上传的MultipartFile对象. // doc格式 List wordP ...

  4. java使用poi读取doc和docx文件

    这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码. 我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码. 于 ...

  5. POI读取.doc 和.docx的区别

    一:认识POI  Apache POI是一个开源的利用Java读写Excel.WORD等微软OLE2组件文档的项目.最新的3.5版本有很多改进,加入了对采用OOXML格式的Office 2007支持, ...

  6. word完美转html(doc、docx 图片转base64编码)

    近期在做一个项目,里面涉及到关于word转html的需求.要求上传一个word文档,转换成html进行在线预览编辑个功能.由于我选择将预览修改后的文档保存到S3里面,所以我选择将word中的图片直接转 ...

  7. POI读取doc、docx文件

    1.明确几个概念: Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(Charac ...

  8. html document怎么转换成word,Doxillion Document Converter – 将 DOC、DOCX、PDF、WPS、Word、HTML文档格式互相转换...

    在办公领域经常会遇到各种各样的文件格式,因此常常有DOC.DOCX.PDF.WPS.Word.HTML 等各种不同格式的文档互相转换的需求.虽然网上有很多在线转换网站或 文档格式转换软件,不过今天推荐 ...

  9. java如何解析word大纲_Java POI 解析word文档

    实现步骤: 1.poi实现word转html 2.模型化解析html 3.html转Map数组 Map数组(数组的操作处理不做说明) 1.导jar包. 2.代码实现 package com.web.o ...

  10. poi解析word文档(解析表格,emf,wmf,svg转jpg图片)

    POI解析word文档 poi解析word的表格:   提前先准备需要的jar包:   <!-- poi --><dependency><groupId>org.a ...

最新文章

  1. TCP和UDP的最完整的区别
  2. 阿里云CentOS 7.4 配置Nginx、PHP、Mariadb
  3. jmeter启动报错 Error occurred during initialization of VM Could not reserve enough space for object heap
  4. 工作一年后,我有些感悟(写于2017年)
  5. 1.1-1.5-vim编辑器
  6. Tuple VS ValueTuple
  7. 用g++编译生成动态连接库*.so的方法及连接
  8. SESSIONS.ser 的问题
  9. 图论算法——无向图的连通分量
  10. 前端取色器 FSCapture
  11. js调用摄像头拍照,js调用摄像头在线拍照,js调用电脑摄像头拍照
  12. FleaPHP 1.0.70 开发进度汇报专贴
  13. NLP的两种工具的java版使用:复旦FudanNLP,中科院计算所ICTCLAS2013
  14. 一个简单的python例子(监控网页是否运行)
  15. red5简介及基础知识
  16. keil5编译器出现Undefined symbol time (referred from xxx.o).
  17. 使用Git Bash的scp复制文件到Linux
  18. 设计模式_迭代器模式01
  19. PS(PhotoShop)替换纯色图片的颜色
  20. 前端开发规范【范本】

热门文章

  1. 基于Comsol进行薄膜型声学超材料的低频降噪仿真分析
  2. Android万能播放器Vitamio
  3. 怎么去掉手机端iPhone发邮件自带的小尾巴(签名),安卓APP同理
  4. 2016计算机微课作品,Office 2016电脑办公基础教程(微课版)
  5. 【Linux】vi编辑器如何使用
  6. 单片机学习笔记————51单片机实现按住一个独立按键不松手的加速匀速触发
  7. hover图片显现遮罩 点击切换图片
  8. 杭州幕墙玻璃维修幕墙玻璃修复
  9. 让程序不触发 Vista/Win7下应用程序兼容性助手弹出
  10. 在Visual Basic 中使用C++ 类 (转)