一、.doc和.docx两种后缀的区别
docx文件比doc文件所占用空间更bai小。
docx格式的文件本质du上是一个ZIP文件。将一个docx文件的后缀改为ZIP后是可dao以用解压工具打开或是解压的。事实上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。
docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZIP后解压, 可以看到解压出来的文件夹中有word这样一个文件夹,它包含了Word文档的大部分内容。而其中的document.xml文件则包含了文档的主要文本内容。
具体来讲可以分以下几个区别:
1、运行环境不同,docx格式的文件是Office2007及以上版本保存的新型文档,而doc是Word2003以及之前版本保存的文档,如果要转化它们还需要特殊的兼容系统。
2、它们所占用的内存空间不同,docx更加节省空间。
3、它们的响应速度有所不同,docx比doc的响应速度更加快捷,并且更加方便修改文件。
4、docx格式的文件本质上是一个ZIP文件,是docx文件的容器。而doc则容纳文字格式、脚本语言及复原等资讯的文件。
二、java对word文件的解析
2.1 引入所需要的jar包
<!--解析doc文档的HWPFDocument对象在这个包里-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<!--解析docx文档的XWPFDocument对象在这个包里-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2.2常用方法
XWPFDocument类(文档类):
xd.getAllPictures(); 返回图片列表
xd.getParagraphs(); 返回段落列表
xd.getTables(); 返回表格列表
xd.getFooterList(); 返回脚脚列表
xd.getFootnotes(); 返回脚注列表
xd.getHeaderList(); 返回页眉列表
xd.getEndnotes(); 返回尾注列表
XWPFParagraph类(段落类):
xwpfParagraph.getText(); 返回段落的文本内容,包括图片中的文本和其中的sdt元素。
xwpfParagraph.getParagraphText(); 返回段落的文本,但不返回段落中的任何对象
xwpfParagraph.getRuns()); 返回段落run的列表
XWPFTable类(表格类):
xwpfTable.getRows(); 返回行对象XWPFTableRow
XWPFTableRow类(表格行类):
xwpfTableRow.getTableCells(); 返回单元格对象XWPFTableCell
xwpfTableCell.getParagraphs(); 返回单元格里面的段落
xwpfTableCell.getTables(); 返回单元格里面的表格
2.3准备一个docx文件
2.4解析这个文档 DocXUtils
package com.xuexue.firstproject.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class DocXUtils {
public static void main(String[] args) {
String filePath = "F:\\work\\other\\测试docx文档解析.docx";
String suffix = filePath.substring(filePath.lastIndexOf("."));
if(".docx".equals(suffix)){
System.out.println("文件类型是.docx");
dealDocXFile(filePath);
}
}
public static void dealDocXFile(String filePath){
InputStream input = null;
try {
//实例化解析docx文档的对象
input = new FileInputStream(filePath);
XWPFDocument xd = new XWPFDocument(input);
//1 getAllPackagePictures()此包装中的所有图片
List<XWPFPictureData> xwpfPictureDataList2 = xd.getAllPictures();
if(CollUtil.isNotEmpty(xwpfPictureDataList2)){
for (XWPFPictureData xwpfPictureData : xwpfPictureDataList2) {
//图像的文件名
System.out.println("图片名称:" + xwpfPictureData.getFileName());
}
}
//文本的段落
List<XWPFParagraph> xwpfParagraphList = xd.getParagraphs();
dealParagraph(xwpfParagraphList);
//文本的表格
List<XWPFTable> xwpfTableList = xd.getTables();
dealTable(xwpfTableList);
//页脚列表
List <XWPFFooter> xwpfFooterList = xd.getFooterList();
//System.out.println("页脚列表size:"+xwpfFooterList.size());
if(CollUtil.isNotEmpty(xwpfFooterList)){
for (XWPFFooter xwpfFooter : xwpfFooterList) {
//页脚的文本的段落
dealParagraph(xwpfFooter.getParagraphs());
dealTable(xwpfFooter.getTables());
System.out.println("getText:"+xwpfFooter.getText());
}
}
//脚注列表
List <XWPFFootnote> xwpfFootnoteList = xd.getFootnotes();
for(XWPFFootnote xwpfFootnote : xwpfFootnoteList){
//处理脚注段落
dealParagraph(xwpfFootnote.getParagraphs());
dealTable(xwpfFootnote.getTables());
}
//页眉列表
List <XWPFHeader> xwpfHeaderList = xd.getHeaderList();
if(CollUtil.isNotEmpty(xwpfHeaderList)){
for(XWPFHeader xwpfHeader : xwpfHeaderList){
dealParagraph(xwpfHeader.getParagraphs());
dealTable(xwpfHeader.getTables());
System.out.println(xwpfHeader.getText());
}
}
//尾注列表
List<XWPFEndnote> xwpfEndnoteList = xd.getEndnotes();
if(CollUtil.isNotEmpty(xwpfEndnoteList)){
for(XWPFEndnote xwpfEndnote : xwpfEndnoteList){
dealParagraph(xwpfEndnote.getParagraphs());
dealTable(xwpfEndnote.getTables());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件没有找到");
} catch (IOException e) {
e.printStackTrace();
System.out.println("发生io异常");
}
}
public static void dealParagraph(List<XWPFParagraph> xwpfParagraphListList){
if(CollUtil.isNotEmpty(xwpfParagraphListList)){
for(XWPFParagraph xwpfParagraph : xwpfParagraphListList){
if(ObjectUtil.isNull(xwpfParagraph) || StrUtil.isEmpty(xwpfParagraph.getText())){
continue;
}
System.out.println("______________________________________________________________");
//返回段落的文本内容,包括图片中的文本和其中的sdt元素。String
System.out.println("getText~~~~~~~~~~~:"+xwpfParagraph.getText());
//返回段落的文本,但不返回段落中的任何对象.String
System.out.println("getParagraphText:~~"+xwpfParagraph.getParagraphText());
System.out.println("getRuns~~~~~~~~~~~:"+xwpfParagraph.getRuns());
}
}
}
public static void dealTable(List<XWPFTable> xwpfTableList){
if(CollUtil.isNotEmpty(xwpfTableList)){
for(XWPFTable xwpfTable : xwpfTableList){
//遍历行
for(XWPFTableRow xwpfTableRow : xwpfTable.getRows()){
//遍历单元格
for(XWPFTableCell xwpfTableCell : xwpfTableRow.getTableCells()){
//处理段落
dealParagraph(xwpfTableCell.getParagraphs());
dealTable(xwpfTableCell.getTables());
}
}
}
}
}
}
对你有帮助就点个赞呗~~