使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述
在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片在文档中合理显示。
二、环境准备
在开始编写代码之前,需要确保项目中已经添加了 poi-ooxml
依赖。如果你使用的是 Maven 项目,可以在 pom.xml
文件中添加以下依赖:
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version>
</dependency>
三、代码详细解释
package cn.com.weisoft;import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;public class Main {public static void main(String[] args) {//创建一个document对象,相当于新建一个word文档(后缀名为.docx)。XWPFDocument document = new XWPFDocument();//创建一个段落对象。XWPFParagraph paragraph = document.createParagraph();//创建一个run。run具体是什么,我也不知道。但是run是这里面的最小单元了。XWPFRun run = paragraph.createRun();//插入图片try {String imgpath = "/Users/admin/Downloads/6.jpg";for(int i=1;i<10;i++) {int[] wh = getImageWidthAndHeight(imgpath);int[] afwh = transWidthAndHeight(wh);run.setText(i+"、Hello World");run.addBreak();run.setText("https://www.escdns.com");run.addBreak();run.addPicture(Files.newInputStream(Paths.get(imgpath)),XWPFDocument.PICTURE_TYPE_PNG,imgpath,Units.toEMU(afwh[0]),Units.toEMU(afwh[1]));}//创建一个输出流 即是该文档的保存位置OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/admin/Downloads/1.docx"));document.write(outputStream);outputStream.close();} catch (Exception ex) {System.out.println(ex.getMessage());}}//取得图片宽度和高度public static int[] getImageWidthAndHeight(String imgPath) {int[] wh = new int[]{0, 0};if (imgPath.isEmpty()) {return wh;}// 读取图片文件try {File imageFile = new File(imgPath);BufferedImage bufferedImage = ImageIO.read(imageFile);if (bufferedImage != null) {wh[0] = bufferedImage.getWidth();wh[1] = bufferedImage.getHeight();}} catch (Exception ex) {ex.printStackTrace();}return wh;}//等比缩放public static int[] transWidthAndHeight(int[] wh) {int w = 410;int h = 0;int rh = w * wh[1] / wh[0];int[] r = new int[]{w, rh};return r;}
}
四、功能说明:
4.1、包导入
org.apache.poi.util.Units
:用于单位转换,在插入图片时会将像素单位转换为 EMU(English Metric Unit)单位。
org.apache.poi.xwpf.usermodel
下的类:用于操作 Word 文档,如创建文档、段落、运行对象等。
javax.imageio.ImageIO
和 java.awt.image.BufferedImage
:用于读取图片文件并获取图片的宽度和高度。
java.io.File
、java.io.OutputStream
、java.nio.file.Files
和 java.nio.file.Paths
:用于文件操作,包括读取图片文件和创建 Word 文档输出流。
4.2、main
方法
XWPFDocument document = new XWPFDocument();
创建一个新的 .docx
格式的 Word 文档对象。
4.3、创建段落和运行对象
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
创建一个段落对象,然后在段落中创建一个运行对象。运行对象是操作文本和图片的最小单元,可以在其中设置文本、插入图片等。
4.4、循环插入文本和图片
for(int i=1;i<10;i++) {int[] wh = getImageWidthAndHeight(imgpath);int[] afwh = transWidthAndHeight(wh);run.setText(i+"、Hello World");run.addBreak();run.setText("https://www.escdns.com");run.addBreak();run.addPicture(Files.newInputStream(Paths.get(imgpath)),XWPFDocument.PICTURE_TYPE_PNG,imgpath,Units.toEMU(afwh[0]),Units.toEMU(afwh[1]));
}
循环 9 次,每次插入编号、“Hello World” 文本、网址和一张图片。在插入图片前,先调用 getImageWidthAndHeight
方法获取图片的原始宽度和高度,再调用 transWidthAndHeight
方法进行等比缩放。
4.5、保存文档
OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/admin/Downloads/1.docx"));
document.write(outputStream);
outputStream.close();
创建一个输出流,将文档内容写入指定的文件路径,最后关闭输出流。
getImageWidthAndHeight
方法:
public static int[] getImageWidthAndHeight(String imgPath) {int[] wh = new int[]{0, 0};if (imgPath.isEmpty()) {return wh;}try {File imageFile = new File(imgPath);BufferedImage bufferedImage = ImageIO.read(imageFile);if (bufferedImage != null) {wh[0] = bufferedImage.getWidth();wh[1] = bufferedImage.getHeight();}} catch (Exception ex) {ex.printStackTrace();}return wh;
}
该方法用于获取指定路径图片的宽度和高度。如果图片路径为空,则返回 [0, 0]
。读取图片文件时,如果出现异常会打印异常信息。
transWidthAndHeight
方法:
public static int[] transWidthAndHeight(int[] wh) {int w = 410;int h = 0;int rh = w * wh[1] / wh[0];int[] r = new int[]{w, rh};return r;
}
该方法用于对图片进行等比缩放。将图片的宽度固定为 410 像素,根据原始图片的宽高比计算出缩放后的高度。
五、注意事项
5.1、文件路径
代码中的图片路径和文档保存路径是硬编码的,需要根据实际情况进行修改。确保路径存在且程序有读写权限。
5.2、图片格式
代码中指定图片类型为 XWPFDocument.PICTURE_TYPE_PNG
,如果实际图片是其他格式(如 JPEG),需要相应修改。
5.3、异常处理
代码中使用了 try-catch
块捕获异常,但只是简单地打印异常信息。在实际开发中,可以根据具体需求进行更详细的异常处理。
通过以上内容便可轻轻松松完成wod导出.是不是超级简单.有任何问题欢迎留言哦!!!
重点!重点!重点!
遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!
易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)
相关文章:
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...

TransmittableThreadLocal:穿透线程边界的上下文传递艺术
文章目录 前言一、如何线程上下文传递1.1 ThreadLocal单线程1.2 InheritableThreadLocal的继承困境1.3 TTL的时空折叠术 二、TTL核心设计解析2.1 时空快照机制2.2 装饰器模式2.3 采用自动清理机制 三、设计思想启示四、实践启示录结语 前言 在并发编程领域,线程上下…...

基于STM32的甲醛检测
一、制作目标 以正点原子的miniSTM32F103RCT6开发板为主控,使用甲醛传感器检测环境空气中的甲醛含量(以mg/m^3为单位)、C02含量(以ppm为单位)和总有机挥发物含量TVOC(以mg/m^3为单位)在OLED显示…...

洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术
目录 一、洛图报告新焦点:FSHD 为何成为显示产业重要突破方向? (一)洛图报告核心结论:从技术突围到产业重构 二、技术解析:FSHD 如何重构显示底层逻辑? (一)物理架构…...
含锡电镀废水深度净化技术体系解析化利用的全流程优化
一、含锡电镀废水的产生机理与污染特征 含锡电镀废水主要形成于三个关键生产环节:镀槽液定期置换排放、镀件后处理清洗水以及车间地面冲洗水。其中,清洗水作为电镀工艺的附属产物,承担着清除镀层表面残留镀液的重要功能;冲刷废水则…...

【MySQL】事务(重点)
目录 一、什么是事务: 二、事务的前置知识了解 引擎是否支持事务 事务的提交方式 事务操作的前置准备: 三、事务回滚: 四、事务崩溃: 原子性: 持久性: 五、自动提交和手动提交: 六、…...

Linux:线程同步与互斥
目录 线程互斥 锁 初始化 销毁 加锁 解锁 线程同步 条件变量 初始化 销毁 等待条件满足 唤醒等待 pthread_cond_signal pthread_cond_broadcast 生产者消费者模型 3种关系 2种角色 1个交易场所 POSIX信号量 初始化 销毁 等待 发布 线程互斥 互斥相关…...

每天五分钟机器学习:拉格朗日对偶函数
本文重点 在数学优化领域,拉格朗日对偶函数作为连接原始约束问题与对偶问题的核心纽带,展现了将复杂约束优化转化为无约束优化的方式。 数学表达 原始问题建模 拉格朗日函数构造 此时的目标就是: 先假设w为常数,让拉格朗日函数对橙子变量λ求极大值,消掉λ之后,在对λ求…...

AutoGen 框架解析:微软开源的多人 Agent 协作新范式
一、引言 在大语言模型(LLM)快速发展的今天,复杂任务的自动化协作需求日益增长。微软开源的AutoGen 框架(GitHub Star 超 10 万)提供了一种基于多智能体对话的协作范式,通过自然语言交互实现多角色 Agent …...

【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件
前言 现已退出科研界,本人水货一个。希望帮到有缘人 本篇关于如何将latex环境中的参考文献bib文件转化为word,和一些踩坑记录。 可以看下面的资料进行配置,后面的文字是这些资料的补充说明。 参考文章:https://blog.csdn.net/g…...
Listremove数据时报错:Caused by: java.lang.UnsupportedOperationException
看了二哥的foreach陷阱后,自己也遇见了需要循环删除元素的情况,立马想到了当时自己阴差阳错的避开所有坑的解决方式:先倒序遍历,再删除。之前好使,但是这次不好使了,报错Caused by: java.lang.UnsupportedO…...
k8s node 报IPVS no destination available
在 Kubernetes 集群中,IPVS no destination available 错误通常表示 kube-proxy(IPVS 模式)无法为 Service 找到可用的后端 Pod。这会导致流量无法正确转发,影响服务可用性。以下是详细的排查和解决方法: 一、错误原因…...

单片机-STM32部分:10-2、逻辑分析仪
飞书文档https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安装包如下:根据自己的系统选择,目前这个工具只有window版本哦 安装方法比较简单,都按默认下一步即可,注意不要安装到中文路径哦。 其余部分参考飞书文档…...

计算机网络基础科普
IP地址是计算机网络中标识设备的唯一地址 IPv4(32位)IPv6(128位) 1.IPv4(32位) 简介:IPv4(Internet Protocol version 4)是互联网协议(IP)的…...

阿里云CDN的源站配置:权重的详解
在阿里云CDN中为静态资源域名cdn.example.com配置源站时,权重设置需根据实际架构和目标灵活调整。以下是具体建议和配置步骤: 一、权重的核心作用 在阿里云CDN中,源站权重用于控制多个源站之间的流量分配比例,适用于以下场景&…...
《Python星球日记》 第37天:向量与矩阵进阶
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、特征值与特征向量1. 基本概念2. 如何找到特征值和特征向量3. 特征值和特征向量的几何意义二…...

虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅
虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅1.电源管理2.显卡优先设置3.拯救者支持FnQ性能模式切换,建议开发前切至“野兽模式”或高性能模式。4.NVIDIA 驱动设置5.VS2022中…...

【Linux】冯诺依曼体系结构和操作系统的理解
目录 冯诺依曼体系结构一个例子来深入理解 初识操作系统操作系统的作用设计操作系统的目的操作系统之上和之下分别有啥 管理的精髓,先描述,再组织 冯诺依曼体系结构 我们知道,计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想…...
如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 构建容器镜像并将其推送到容器镜像库 (BASIC ALL) 在构建和推送容器镜像之前,您必须通过容器镜像库的身份验证。 …...

计网学习笔记———网络
🌿网络是泛化的概念 网络是泛化的概念 🍂泛化理解 网络的概念在生活中无处不在举例:社交网络、电话网路、电网、计算机网络 🌿网络的定义 定义: 离散的个体通过通讯手段连成群体,实现资源的共享与交流、个…...
计算机三大主流操作系统的前世今生 - Linux|macOS|Windows
全文目录 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 综合解析3.1 Linux系统综合解析3.1.1 系统定义与核心架构3.1.2 发展历程3.1.3 核心特点3.1.4 主流发行版3.1.5 应用场景 3.2 macOS系统综合解析3.2.1 系统定义与核心架构3.2.2 发展历程3.2.3 核心特点…...

数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall
数据集-目标检测系列- 消防 浓烟 检测数据集 smoke>> DataBall 数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-10…...

【单片机毕业设计15-基于stm32c8t6的智能酒窖系统设计】
【单片机毕业设计15-基于stm32c8t6的智能酒窖系统设计】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇15-基于stm32c8t6的智能酒窖系统设计 🧿创作不易,拒绝白嫖可私 一、功能介绍 ----…...

【Bluedroid】蓝牙 HID 设备服务注册流程源码解析:从初始化到 SDP 记录构建
本文围绕蓝牙 HID(人机接口设备)服务注册流程,详细解析从 HID 服务启用、设备初始化、L2CAP 通道注册到 SDP(服务发现协议)记录构建的全流程。通过分析关键函数如btif_hd_service_registration、BTA_HdEnable、HID_Dev…...

TWAS、GWAS、FUSION
全基因组关联研究(GWAS,Genome-Wide Association Study)是一种统计学方法,用于在全基因组水平上识别与特定性状或疾病相关的遗传变异。虽然GWAS可以识别与性状相关的遗传信号,但它并不直接揭示这些遗传变异如何影响生物…...

测试一下多模态提取图片中文字的能力
测试一下多模态提取图片中文字的能力 原图片, 提取结果, 各位嘉宾,大家好!明天(5月11日)9:00-12:00将在大连市高新园区星火亚庭32号A座一层二楼设置咖啡厅等六个小水活动。请大家积极安排时间,…...

(51单片机)LCD显示红外遥控相关数字(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)
前言: 本次Timer0模块改装了一下,注意!!!今天只是简单的实现一下,明天用次功能显示遥控密码锁 演示视频: 在审核 源代码: 如上图将9个文放在Keli5 中即可,然后烧录在…...

物品识别 树莓派4 YOLO v11
让树莓派可以识别身边的一些物品 python3 -m venv --system-site-packages yolooo source yolooo/bin/activate 树莓派换清华源,bookworm 下面这条命令将安装 OpenCV 以及运行 YOLO 所需的基础设施 pip install ultralytics 还会安装大量其他软件包,…...

【计算机视觉】3DDFA_V2中表情与姿态解耦及多任务平衡机制深度解析
3DDFA_V2中表情与姿态解耦及多任务平衡机制深度解析 1. 表情与姿态解耦的技术实现1.1 参数化建模基础1.2 解耦的核心机制1.2.1 基向量正交化设计1.2.2 网络架构设计1.2.3 损失函数设计 1.3 实现代码解析 2. 多任务联合学习的权重平衡2.1 任务定义与损失函数2.2 动态权重平衡策略…...

istio in action之流量控制与路由
当流量进入集群后,我们如何确保它能被精确地路由到正确的服务?特别是当我们需要发布新版本时,如何在不中断服务的前提下,安全地将用户引入到新版本?这正是我们今天要深入探讨的精细化流量控制,看看 Istio 如…...