使用 Apache POI 生成包含文本和图片的 Word 文档

一、概述

在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片在文档中合理显示。

二、环境准备

在开始编写代码之前,需要确保项目中已经添加了 poi-ooxml 依赖。如果你使用的是 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

java 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>

三、代码详细解释

java 复制代码
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.ImageIOjava.awt.image.BufferedImage:用于读取图片文件并获取图片的宽度和高度。

java.io.Filejava.io.OutputStreamjava.nio.file.Filesjava.nio.file.Paths:用于文件操作,包括读取图片文件和创建 Word 文档输出流。

4.2、main 方法

java 复制代码
XWPFDocument document = new XWPFDocument();

创建一个新的 .docx 格式的 Word 文档对象。

4.3、创建段落和运行对象

java 复制代码
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();

创建一个段落对象,然后在段落中创建一个运行对象。运行对象是操作文本和图片的最小单元,可以在其中设置文本、插入图片等。

4.4、循环插入文本和图片

java 复制代码
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、保存文档

java 复制代码
OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/admin/Downloads/1.docx"));
document.write(outputStream);
outputStream.close();

创建一个输出流,将文档内容写入指定的文件路径,最后关闭输出流。

getImageWidthAndHeight 方法

java 复制代码
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 方法

java 复制代码
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)

相关推荐
诸葛小猿2 小时前
Pdf转Word案例(java)
java·pdf·word·格式转换
搜移IT科技7 小时前
word怎么删除空白页?word最后一页删不掉怎么办
word
源梦想8 小时前
Word如何制作三线表格
word
tangjunjun-owen1 天前
第三章:langchain加载word文档构建RAG检索教程(基于FAISS库为例)
langchain·llm·word·faiss·rag
人类发明了工具1 天前
【工具使用-数据可视化工具】Apache Superset
信息可视化·apache·superset
bu_shuo1 天前
Edge浏览器PDF字体显示错误
pdf·word·渲染错误
就叫年华吧丶1 天前
Apache POI实现Excel的基本写入、导出操作
java·maven·apache·excel
执键行天涯1 天前
Apache Velocity代码生成简要介绍
开发语言·python·apache
IT成长日记1 天前
【Hive入门】Hive行级安全:基于Apache Ranger的细粒度访问控制深度解析
hive·安全·apache·apache ranger