java通过poi解析word入门

文章目录

  • 介绍
  • 一、了解word docx文档的结构
  • 二、引入POI的依赖
  • 三、解析Word文档常用API
    • 加载Word文档
    • 获取文档整体结构
    • 获取文档中的段落
    • 获取文档中的表格
    • 获取文档中的脚注
  • 四、解析Word中的段落示例
  • 五、读取Word文档并遍历图片
  • 六、解析Word中的图片示例


介绍

Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作。


一、了解word docx文档的结构

将word文档另存为xml文档
在这里插入图片描述

打开xml文档,可以查看到xml的结构
在这里插入图片描述

二、引入POI的依赖

   <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文档并遍历其中的图片,通常涉及以下几个步骤:

  1. 创建XWPFDocument对象:使用XWPFDocument类来表示Word文档,并通过OPCPackage.open()方法加载文档。

  2. 遍历文档内容:Word文档中的图片通常包含在段落(XWPFParagraph)的运行(XWPFRun)中。你需要遍历文档中的每个段落,再遍历每个段落中的每个运行。

  3. 获取图片数据:在每个运行中,你可以通过调用getEmbeddedPictures()方法来获取嵌入的图片列表(注意,这个方法可能在新版本的POI中有所不同,具体请参考官方文档)。然后,通过XWPFPictureData对象获取图片的二进制数据和类型。

  4. 处理图片数据:一旦你获得了图片的二进制数据,就可以将其保存到文件系统中,或进行其他处理。

六、解析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);}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267868.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画入门实践|Midjourney:使用 --no 去除不想要的物体

在 Midjourney 中&#xff0c;--no 作为反向提示词&#xff0c;告诉 MJ 在生成图像时&#xff0c;不要包含什么。 使用格式&#xff1a;--no 对应物体提示词&#xff08;多个物体之间使用","间隔&#xff09; 使用演示 a web banner, summer holiday --v 6.0 a web b…

[MySQL][深入理解隔离性][下][Read View]详细讲解

目录 1.Read View1.是什么&#xff1f;2.理解3.整体流程 2.RR与RC的本质区别1.当前读和快照读在RR级别下的区别2.RR与RC的本质区别 1.Read View 1.是什么&#xff1f; Read View就是事务进行 快照读 操作的时候生产的 读视图(Read View)&#xff0c;在该事务执行快照读的那一…

C语言 #指针数组 #数组指针 #数组参数、指针参数

文章目录 前言 一、指针数组 1、概念&#xff1a; 2、指针数组有什么用呢&#xff1f; 二、数组指针 1、数组指针的定义 2、数组名与 &数组名 的区别 3、数组指针如何初始化&#xff1f; 4、数组指针的用法 三、根据代码区分 指针数组 和 数组指针 四、数组参数、指针参数 …

VLAN通讯实验

目录 拓扑图 需求 需求分析 配置过程 1、手工配置 2、 使用DHCP获得IP地址信息 3、测试全网是否可达 拓扑图 需求 1、PC1、PC3属于VLAN 2 2、PC2、PC4属于VLAN 3 3、通过DHCP使得PC获取IP地址信息 4、全网可达 需求分析 1、先手工配置网段&#xff0c;VLAN 2为192.168.1…

在invidia jetpack4.5.1上运行c++版yolov8(tensorRT)

心路历程(可略过) 为了能在arm64上跑通yolov8,我试过很多很多代码,太多对库版本的要求太高了; 比如说有一个是需要依赖onnx库的,(https://github.com/UNeedCryDear/yolov8-opencv-onnxruntime-cpp) 运行成功了报错error: IOrtSessionOptionsAppendExecutionProvider C…

【网络安全的神秘世界】文件包含漏洞

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 文件包含&#xff1a;重复使用的函数写在文件里&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;而无需再…

使用代理IP进行本地SEO优化:如何吸引附近的客户?

在今天竞争激烈的互联网时代&#xff0c;如何利用代理IP进行本地SEO优化并吸引附近的客户已经成为许多企业和网站面临的关键挑战。本文将探讨使用代理IP的策略和技巧&#xff0c;以帮助公司提高在本地市场的可见性和吸引力&#xff0c;从而扩大本地客户群体。 1. 代理IP在本地…

打卡第24天------回溯算法

表达一下自己每天的刷题想法。希望我刷完代码随想录,自己的进步能有大幅度的提升。 一、复原IP地址 leetcode题目链接:93.复原IP地址 题目描述: 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 . 来形成。…

Blackbox AI-跨时代AI产物,你的私人编程助手

1. 引言 随着人工智能技术的飞速发展&#xff0c;我们的生活方式正在经历前所未有的变革。从智能家居到自动驾驶&#xff0c;AI已经渗透到我们生活的方方面面。而在这场科技革命中&#xff0c;Blackbox 网站凭借其先进的技术和全面的功能&#xff0c;成为了众多AI产品中的佼佼者…

ubuntu一些好用的开发工具及其配置

1 终端模糊搜索fzf https://github.com/junegunn/fzf 输入某命令&#xff0c;比如 conda &#xff0c;按下ctrlR&#xff0c;会显示和该命令匹配的历史命令的列表 有了这个工具再也不用记忆太复杂的命令&#xff0c;只需要知道大概几个单词&#xff0c;输入即可搜索。 其搜索…

基于SVPWM的霍尔传感器FOC实现过程

FOC算法笔记 起源&#xff1a;使用ST WorkBench配置的HALL BLDC控制算法抖动严重。 ST的电机控制算法&#xff0c;代码非常高端大气&#xff0c;值得学习。 HAL库与LL库混用&#xff0c;效率很高。很多中断回调都直接重写了&#xff0c;没有使用HAL库那一套。 只是好多地方…

JavaScript关键词

JavaScript 关键词 JavaScript 语句常常通过某个关键词来标识需要执行的 JavaScript 动作。 下面的表格列出了一部分将在教程中学到的关键词&#xff1a; 关键词 描述 break 终止 switch 或循环。 continue 跳出循环并在顶端开始。 debugger 停止执行 JavaScript&…

matplotlib 画图函数,最常用的

并排显示2个图片 import os import numpy as np from PIL import Image import matplotlib.pyplot as pltimage1 Image.open(a.png) image2 Image.open(a2.png)# Create a figure with two subplots (1 row, 2 columns) fig, axes plt.subplots(1, 2, figsize(10, 5))# Di…

双非二本毕业生如何进入嵌入式系统领域?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 二本的话学历上会吃点亏…

docker Docs相关使用文档链接

Docker Docshttps://docs.docker.com/ docker compose | Docker Docshttps://docs.docker.com/reference/cli/docker/compose/docker | Docker Docshttps://docs.docker.com/reference/cli/docker/

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个&#xff0c;一是设置全局config,比如请求的基础路径&#xff0c;超时时间等&#xff0c;第二点是在每次…

MySQL零散拾遗(四)--- 使用聚合函数时需要注意的点点滴滴

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始

我是从excel中将数据导入&#xff0c;然后再通过sql插入数据&#xff0c;就报错。 需要设置自增ID开始值 1、确定序列名称&#xff1a; 首先&#xff0c;需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id&#xff0c;可以使用以下查询来获取序列名称…

H264编码标准环路滤波原理

方块效应产生原因 原因 1&#xff1a;最重要的一个原因是基于块的帧内和帧间预测残差的 DCT 变换。变换系数的量化过程相对粗糙&#xff0c;因而反量化过程恢复的变换系数带有误差&#xff0c;会造成在图像块边界上的视觉不连续。原因 2&#xff1a;其次原因自于运动补偿预测。…

元素标签的attr属性的巧妙利用(值得收藏)

前言 需求如图&#xff1a; 虽然可以通过一个标签&#xff0c;直接赋值&#xff0c;然后通过定位也能实现需求;但是另一种方式更巧妙&#xff0c;有时候可以通过少量代码实现多样的需求&#xff0c;把一个元素展示在盒子上的方法&#xff0c;通过使用元素的attr属性&#xf…