java通过poi解析word入门
shandongwill 2024-08-23 08:35:02 阅读 61
文章目录
介绍一、了解word docx文档的结构二、引入POI的依赖三、解析Word文档常用API加载Word文档获取文档整体结构获取文档中的段落获取文档中的表格获取文档中的脚注
四、解析Word中的段落示例五、读取Word文档并遍历图片六、解析Word中的图片示例五、项目下载
介绍
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作。
一、了解word docx文档的结构
将word文档另存为xml文档
打开xml文档,可以查看到xml的结构
二、引入POI的依赖
<code> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
三、解析Word文档常用API
加载Word文档
读取docx文件,获取XWPFDocument 实例
FileInputStream fis = new FileInputStream("C:\\test.docx");
XWPFDocument document = new XWPFDocument(fis);
获取文档整体结构
document.getBodyElements获取了docx文档所有的元素,可以根据类型判断段落、表格、还是引注。段落(XWPFParagraph)、表格(XWPFTable)、引注(XWPFSDT)
List<IBodyElement> bodyElements = document.getBodyElements();
for(int i=0;i<size;i++) { -- -->
IBodyElement iBodyElement = bodyElements.get(i);
if(iBodyElement instanceof XWPFParagraph){
XWPFParagraph xwpParagraph=(XWPFParagraph)iBodyElement;
}
if(iBodyElement instanceof XWPFTable){
XWPFTable xwpfTable=(XWPFTable)iBodyElement;
}
if(iBodyElement instanceof XWPFSDT){
XWPFSDT xwpfSdt=(XWPFSDT)iBodyElement;
}
}
获取文档中的段落
// 获取所有段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
获取文档中的表格
// 获取所有表格
List<XWPFTable> xwpfTableList = xwpfDocument.getTables();
获取文档中的脚注
// 获取所有脚注
List<XWPFFootnote> footnotes = document.getFootnotes();
四、解析Word中的段落示例
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class WordReader {
public static void main(String[] args) {
try {
// 加载Word文档
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.docx");
XWPFDocument document = new XWPFDocument(fis);
// 获取所有段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
int index=0;
for (XWPFParagraph paragraph : paragraphs) {
// 获取段落样式
String style = paragraph.getStyle();
System.out.println(index++);
System.out.println("style "+style);
System.out.println("getStyleID "+paragraph.getStyleID());
System.out.println(paragraph.getText());
if (paragraph.getStyleID() != null && paragraph.getStyleID().startsWith("Heading")) {
System.out.println("title:"+paragraph.getText());
}
}
// 关闭文档
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、读取Word文档并遍历图片
使用POI读取Word文档并遍历其中的图片,通常涉及以下几个步骤:
创建XWPFDocument
对象:使用XWPFDocument
类来表示Word文档,并通过OPCPackage.open()
方法加载文档。
遍历文档内容:Word文档中的图片通常包含在段落(XWPFParagraph
)的运行(XWPFRun
)中。你需要遍历文档中的每个段落,再遍历每个段落中的每个运行。
获取图片数据:在每个运行中,你可以通过调用getEmbeddedPictures()
方法来获取嵌入的图片列表(注意,这个方法可能在新版本的POI中有所不同,具体请参考官方文档)。然后,通过XWPFPictureData
对象获取图片的二进制数据和类型。
处理图片数据:一旦你获得了图片的二进制数据,就可以将其保存到文件系统中,或进行其他处理。
六、解析Word中的图片示例
下面的示例是获取图片 环绕方式,此外,我们还可以使用其他方法来获取图片的相关信息,例如获取图片的宽度、高度等。Java POI库提供了丰富的API,可以满足各种图片处理需求。
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class WordPictureTest {
public static void main(String[] args) {
try {
// 加载Word文档
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\pic.docx");
XWPFDocument document = new XWPFDocument(fis);
// 获取所有段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
int index=0;
for (XWPFParagraph paragraph : paragraphs) {
parsePicture(paragraph);
}
// 关闭文档
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void parsePicture(XWPFParagraph paragraph){
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run:runs){
List<XWPFPicture> embeddedPictures = run.getEmbeddedPictures();
for(XWPFPicture picture:embeddedPictures){
String fileName = picture.getPictureData().getFileName();
System.out.println(fileName);
CTDrawing drawing = run.getCTR().getDrawingArray(0);
List<CTAnchor> anchorList = drawing.getAnchorList();
List<CTInline> inlineList = drawing.getInlineList();
System.out.println("anchorList "+anchorList.size());
//inlineList.size>0 说明时嵌入式的布局
System.out.println("inlineList "+inlineList.size());
for (CTAnchor anchor :anchorList){
//文字环绕
boolean behindDoc = anchor.getBehindDoc();
boolean setWrapSquare = anchor.isSetWrapSquare();
boolean setWrapThrough = anchor.isSetWrapThrough();
boolean setWrapTight = anchor.isSetWrapTight();
boolean setWrapTopAndBottom = anchor.isSetWrapTopAndBottom();
boolean setWrapNone = anchor.isSetWrapNone();
System.out.println("setWrapNone "+setWrapNone +" behindDoc "+behindDoc);
}
}
}
}
五、项目下载
word文挡解析检查项目下载地址
https://download.csdn.net/download/gwc791224/89597904
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。