当前位置: 首页 > 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)

相关文章:

  • 排序算法——计数排序
  • 开发 Chrome 扩展中的侧边栏图标设置实录(Manifest V3)
  • 医疗人工智能大模型中的关键能力:【中期训练】mid-training
  • 【javascript】console对象
  • 尤雨溪宣布:Vue 生态正式引入 AI
  • lvgl多语言设置
  • 深度学习模型的部署实践与Web框架选择
  • vue3的页面跳转方法汇总(路由跳转,组件跳转)
  • dubbo-token验证
  • 大数据应用开发和项目实战-电商双11美妆数据分析2
  • 《数据结构:二叉搜索树(Binary Search Tree)》
  • 面向智能体开发的声明式语言:可行性分析与未来图景
  • SafeDrive:大语言模型实现自动驾驶汽车知识驱动和数据驱动的风险-敏感决策——论文阅读
  • 【论文阅读】Reconstructive Neuron Pruning for Backdoor Defense
  • 内网渗透技术全面指南——安全业务视角(基于《内网渗透技术 (吴丽进、苗春雨 主编;郑州、雷珊珊、王伦 副主编)》)
  • C++ set和map系列(关联式容器)的介绍及使用
  • 【论文阅读】Towards Stable Backdoor Purification through Feature Shift Tuning
  • Web 架构之负载均衡全解析
  • 【论文阅读】HunyuanVideo: A Systematic Framework For Large Video Generative Models
  • LangChain4j简介
  • 铁肩担道义,历史鉴未来——中共中央政治局委员、外交部长王毅谈习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 邯郸一酒店办婚宴发生火灾,新郎母亲:饭没吃成酒店还要收费
  • 时代中国控股:前4个月销售额18.1亿元,境外债重组协议押后聆讯至5月底
  • 国家主席习近平会见斯洛伐克总理菲佐
  • 游客称在网红雪山勒多曼因峰需救援被开价2.8万,康定文旅:封闭整改
  • 协会:坚决支持司法机关依法打击涉象棋行业的违法行为