Java使用XWPFDocument生成word文档的示例代码

 更新时间:2025年12月08日 09:38:05   作者:codingPower  
XWPFDocument 是 Apache POI 库中用于操作 .docx 格式 Word 文档的核心类,本文将针对 XWPFDocument 进行详细解析,涵盖其核心功能、常见用法及实际开发中的关键点

以下是针对 XWPFDocument 的详细解析,涵盖其核心功能、常见用法及实际开发中的关键点:

1. XWPFDocument 简介

XWPFDocument 是 Apache POI 库中用于操作 .docx 格式 Word 文档的核心类。它提供对文档内容(段落、表格、图片、样式等)的动态生成和修改能力,适用于需要自动化生成复杂 Word 文档的场景。

在pom.xml中添加Apache POI依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.2</version>
</dependency>

2. 核心结构与类

类/接口功能说明
XWPFDocument文档对象,代表整个 .docx 文件,管理所有内容元素。
XWPFParagraph段落对象,控制文本块(如标题、正文、列表)。
XWPFRun段落内的文本片段,可单独设置样式(字体、颜色、加粗等)。
XWPFTable表格对象,支持动态创建表格、合并单元格、设置边框等。
XWPFPicture图片对象,用于插入本地或网络图片。
XWPFHeader/XWPFFooter页眉和页脚,支持全局或分节设置。

3. 核心操作详解

3.1 段落与文本

// 1. 加载模板(文件要在src/main/resources目录下)
 ClassPathResource resource = new ClassPathResource("template/report_template.docx");
 XWPFDocument document = new XWPFDocument(resource.getInputStream());
        
// 创建段落
XWPFParagraph para = document.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);  // 对齐方式(居中)
para.setIndentationFirstLine(600);             // 首行缩进(单位:TWIP)

// 添加文本片段
XWPFRun run = para.createRun();
run.setText("Hello World!");
run.setBold(true);                            // 加粗
run.setFontSize(14);                          // 字号
run.setFontFamily("宋体");                     // 解决中文乱码的关键
run.setColor("FF0000");                       // 字体颜色(RGB 十六进制)
run.addBreak();                               // 换行(类似 <br>)

3.2 表格操作

// 创建表格(3行3列)
XWPFTable table = document.createTable(3, 3);

// 设置列宽(单位:TWIP)
CTTblGrid grid = table.getCTTbl().addNewTblGrid();
grid.addNewGridCol().setW(3000);
grid.addNewGridCol().setW(3000);
grid.addNewGridCol().setW(3000);

// 填充表头
XWPFTableRow headerRow = table.getRow(0);
headerRow.getCell(0).setText("姓名");
headerRow.getCell(1).setText("年龄");
headerRow.getCell(2).setText("部门");

// 合并单元格(横向)
mergeCellsHorizontal(table, 1, 0, 1);
table.getRow(1).getCell(0).setText("合并示例");

// 设置表格边框
CTBorder border = CTBorder.Factory.newInstance();
border.setVal(STBorder.SINGLE);
border.setSz(BigInteger.valueOf(4));  // 边框粗细
table.setTopBorder(border);           // 上边框
table.setBottomBorder(border);        // 下边框

3.3 列表与编号

// 创建编号列表
XWPFParagraph listPara = document.createParagraph();
listPara.setNumID(/* 编号ID,需通过样式定义 */);
XWPFRun listRun = listPara.createRun();
listRun.setText("列表项1");

// 多级列表
CTAbstractNum abstractNum = CTAbstractNum.Factory.newInstance();
// ... 定义多级编号规则(需操作 XML 底层结构)

3.4 图片插入

// 从本地文件读取图片
byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/image.png"));
XWPFParagraph imagePara = document.createParagraph();
XWPFRun imageRun = imagePara.createRun();
imageRun.addPicture(
    new ByteArrayInputStream(imageBytes),
    Document.PICTURE_TYPE_PNG,
    "image.png",
    Units.toEMU(200),   // 宽度(200像素)
    Units.toEMU(150)    // 高度(150像素)
);

4. 高级功能

4.1 页眉与页脚

// 创建页眉
XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
XWPFParagraph headerPara = header.createParagraph();
headerPara.createRun().setText("公司机密 - 第1页");

// 创建页脚(带页码)
XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);
XWPFParagraph footerPara = footer.createParagraph();
footerPara.setAlignment(ParagraphAlignment.CENTER);
footerPara.createRun().setText("页码:");
footerPara.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT");

4.2 超链接

// 插入超链接
CTHyperlink cthyperlink = paragraph.getCTP().addNewHyperlink();
cthyperlink.setId(document.getPackagePart().addExternalRelationship(
    "https://example.com", 
    XWPFRelation.HYPERLINK.getRelation()
).getId());
XWPFRun linkRun = paragraph.createRun();
linkRun.setText("访问示例网站");
linkRun.setUnderline(UnderlinePatterns.SINGLE);
linkRun.setColor("0000FF");

4.3 分页符

// 强制分页
XWPFParagraph pageBreakPara = document.createParagraph();
pageBreakPara.createRun().addBreak(BreakType.PAGE);

5. 样式与模板

5.1 使用预定义样式

// 设置段落样式(需提前定义或使用内置样式)
para.setStyle("Heading1");

5.2 自定义样式

// 创建字符样式
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
CTDocDefaults docDefaults = sectPr.addNewDocDefaults();
CTRPrDefault rPrDefault = docDefaults.addNewRPrDefault();
CTRPr rpr = rPrDefault.addNewRPr();
rpr.addNewB().setVal(STOnOff.TRUE);  // 默认加粗

6. 最佳实践与注意事项

中文乱码问题

  • 必须显式设置中文字体(如 run.setFontFamily("宋体"))。
  • 确保系统或服务器环境支持中文字体。

性能优化

  • 生成大文档时,使用 SXSSFWorkbook 类似的流式处理(但 POI 对 Word 的支持有限)。
  • 及时关闭资源:生成后调用 document.close() 释放内存。

版本兼容性

Apache POI 5.x+ 支持 Office 2019+ 格式,旧版本需降级至 POI 3.x。

错误处理

  • 捕获 IOExceptionInvalidFormatException
  • 使用 try-with-resources 确保流关闭:
try (XWPFDocument doc = new XWPFDocument();
     FileOutputStream out = new FileOutputStream("output.docx")) {
    // 操作文档
}

模板引擎整合

复杂文档建议结合 FreemarkerVelocity 模板引擎,避免硬编码样式。

7. 常见问题解决

  • 表格边框不显示:需显式设置表格边框属性(POI 默认不显示边框)。
  • 生成的文档损坏:确保正确关闭 XWPFDocument 和输出流。
  • 样式不生效:检查样式名称是否正确,或直接通过 XWPFRun 设置样式覆盖。

通过掌握 XWPFDocument 的核心 API 和上述技巧,可以高效生成复杂的 Word 文档,满足企业级应用需求。

到此这篇关于Java使用XWPFDocument生成word文档的示例代码的文章就介绍到这了,更多相关Java XWPFDocument生成word内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java设置session过期时间的实现方法

    java设置session过期时间的实现方法

    这篇文章主要介绍了java设置session过期时间的实现方法,以实例形式详细讲述了具体实现过程,非常具有参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 浅谈Java内存泄露

    浅谈Java内存泄露

    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。下面我们来一起了解如何解决
    2019-05-05
  • Java利用SpEL表达式实现权限校验

    Java利用SpEL表达式实现权限校验

    这篇文章主要为大家详细介绍了Java如何利用SpEL表达式实现权限校验功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Java Map集合使用方法全面梳理

    Java Map集合使用方法全面梳理

    Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value)。一个键(key)和它对应的值构成map集合中的一个元素
    2022-04-04
  • SpringBoot使用thymeleaf模板过程解析

    SpringBoot使用thymeleaf模板过程解析

    这篇文章主要介绍了SpringBoot使用thymeleaf模板过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 基于Spring MVC的文件上传和下载实现方法

    基于Spring MVC的文件上传和下载实现方法

    在Web应用程序中,文件上传和下载是常见的功能,Spring MVC框架提供了方便的方式来实现这些功能,本文将介绍如何使用Spring MVC实现文件上传和下载,需要的朋友可以参考下
    2023-05-05
  • SpringBoot整合阿里云OSS对象存储服务的实现

    SpringBoot整合阿里云OSS对象存储服务的实现

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java泛型详解

    Java泛型详解

    本文给大家汇总介绍了下java中的泛型的相关资料,包括引入泛型机制的原因,泛型类,泛型方法,泛型的实现以及泛型的注意事项,非常的详细,有需要的小伙伴可以参考下
    2016-03-03
  • 解决java main函数中的args数组传值问题

    解决java main函数中的args数组传值问题

    这篇文章主要介绍了解决java main函数中的args数组传值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java对url进行编码和解码实现方式

    java对url进行编码和解码实现方式

    文章详细介绍了如何使用Java对URL进行编码和解码,包括相关技术、实现思路、代码示例和项目总结,通过本文,开发者可以掌握如何使用URLEncoder和URLDecoder进行URL编码解码,并理解字符集的重要性与异常处理的基本方法
    2025-11-11

最新评论