当前位置: 首页 > news >正文

使用 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.Filejava.io.OutputStreamjava.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)

http://www.xdnf.cn/news/317341.html

相关文章:

  • 【MCP】从0到1实现一个MCP Client
  • 【Python类(Class)完全指南】面向对象编程入门
  • 阿里云服务器-centos部署定时同步数据库数据-dbswitch
  • 【Django】中间件
  • 软件工程(三):模块的内聚模型
  • 如何在大型项目中解决 VsCode 语言服务器崩溃的问题
  • 政务浏览器 一站式首页功能配置说明
  • 极狐GitLab 命名空间的类型有哪些?
  • css animation 动画属性
  • 华为昇腾910B通过vllm部署InternVL3-8B教程
  • 大模型系列(五)--- GPT3: Language Models are Few-Shot Learners
  • IPFS集群部署
  • Linux/AndroidOS中进程间的通信线程间的同步 - 信号量
  • Java游戏服务器开发流水账(1)游戏服务器的架构浅析
  • Wireshark抓账号密码
  • 一文走进GpuGeek | conda常用命令
  • Prompt(提示词)工程师,“跟AI聊天”
  • Java版ERP管理系统源码(springboot+VUE+Uniapp)
  • FID和IS的区别
  • STM32裸机开发问题汇总
  • (1-1)Java的JDK、JRE、JVM三者间的关系
  • 淘宝按图搜索商品(拍立淘)爬虫实战指南
  • 技术视界|青龙机器人训练地形详解(二):添加地形到训练环境
  • 光伏“531”政策倒逼下,光储充一体化系统如何破解分布式光伏收益困局?
  • sql错题(3)
  • 学习记录:DAY23
  • 发那科机器人3(机器人编程基础)
  • Python小酷库系列:5个常用的dict属性化访问扩展库
  • Kubernetes调度技术:污点与容忍生产级应用指南
  • Selenium使用指南