XWPFDocument生成word文档介绍(格式 .docx)

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


XWPFDocument

    • 1. XWPFDocument 简介
    • 2. 核心结构与类
    • 3. 核心操作详解
      • **3.1 段落与文本**
      • **3.2 表格操作**
      • **3.3 列表与编号**
      • **3.4 图片插入**
    • 4. 高级功能
      • **4.1 页眉与页脚**
      • **4.2 超链接**
      • **4.3 分页符**
    • 5. 样式与模板
      • **5.1 使用预定义样式**
      • **5.2 自定义样式**
    • 6. 最佳实践与注意事项
    • 7. 常见问题解决

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. 最佳实践与注意事项

  1. 中文乱码问题

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

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

    • Apache POI 5.x+ 支持 Office 2019+ 格式,旧版本需降级至 POI 3.x。
  4. 错误处理

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

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

7. 常见问题解决

  • 表格边框不显示
    需显式设置表格边框属性(POI 默认不显示边框)。

  • 生成的文档损坏
    确保正确关闭 XWPFDocument 和输出流。

  • 样式不生效
    检查样式名称是否正确,或直接通过 XWPFRun 设置样式覆盖。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

crashpad 编译

一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools&#xff08;此步骤可以跳过 最新工具包已上传下载使用即可&#xff09; windows下载压缩包&#xff0c;然后放到系统PATH中 下载完以后&#xff0c;基本就是靠depot_tools这个工具集合了&am…

基于标注数据的情感分析模型研究

标题:基于标注数据的情感分析模型研究 内容:1.摘要 随着互联网的快速发展&#xff0c;大量文本数据蕴含着丰富的情感信息&#xff0c;对其进行情感分析具有重要的商业和社会价值。本研究的目的是构建基于标注数据的情感分析模型&#xff0c;以准确识别文本中的情感倾向。方法上…

【数据链路层深度解析】从帧结构到协议实现

目录 一、数据链路层核心定位1.1 OSI模型中的位置1.2 三大核心职责 二、帧结构详解2.1 以太网帧标准格式&#xff08;IEEE 802.3&#xff09;2.2 帧封装代码示例 三、核心协议机制3.1 MAC地址体系3.2 介质访问控制CSMA/CD&#xff08;以太网冲突检测&#xff09;现代交换机的演…

在若依前后端分离项目中集成 ONLYOFFICE 以实现在线预览、编辑和协作功能

在若依前后端分离项目中集成 ONLYOFFICE 以实现在线预览、编辑和协作功能 概述 ONLYOFFICE 是一款开源的在线文档编辑套件&#xff0c;可实现文档预览、编辑、协作与转换等功能&#xff0c;可通过 Docker 部署 DocumentServer 服务&#xff0c;并通过 HTTP API 或 WOPI 接口与…

SpringMVC 通过ajax 前后端数据交互

在前端的开发过程中&#xff0c;经常在html页面通过ajax进行前后端数据的交互&#xff0c;SpringMVC的controller进行数据的接收&#xff0c;但是有的时候后端会出现数据无法接收到的情况&#xff0c;这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景&#x…

最新DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)

DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集&#xff1a;专为数学定理自动证明设计的超大垂直领域语言模型&#xff08;在线体验地址&#xff09; 体验地址&#xff1a;[Hugging Face 在线体验]https://huggingface.co/playground?modelIddeepseek-ai/DeepS…

Kafka的Topic分区数如何合理设置?

一、分区数设置原则 1. 并发能力基准 分区数决定最大消费者并行度&#xff0c;建议设置为消费者组内消费者数量的整数倍 例如&#xff1a;消费者组有4个实例 → 分区数设为4/8/12等 这里定义的目的是为了让消费者能均匀的分配到分区&#xff0c;避免打破负载均衡&#xff0c;…

章越科技赋能消防训练体征监测与安全保障,从传统模式到智能跃迁的实践探索

引言&#xff1a;智能化转型浪潮下&#xff0c;消防训练的“破局”之需 2021年《“十四五”国家消防工作规划》的出台&#xff0c;标志着我国消防救援体系正式迈入“全灾种、大应急”的全新阶段。面对地震、洪涝、危化品泄漏等复杂救援场景&#xff0c;消防员不仅需要更强的体…

【数据库原理及安全实验】实验五 数据库备份与恢复

指导书原文 数据库的备份与恢复SSMS 【实验目的】 1) 熟悉并掌握利用界面操作进行数据库备份和恢复的原理和操作。 【实验原理】 1) 数据库的恢复包括大容量日志恢复模式和简单恢复模式。其中大容量日志恢复模式&#xff0c;简单地说就是要对大容量操作进行最小日志记录&a…

Linux 基础IO(上)--文件与文件描述符fd

前言&#xff1a; 在生活里&#xff0c;我们常和各种文件打交道&#xff0c;像用 Word 写文档、用播放器看视频&#xff0c;这些操作背后都离不开文件的输入输出&#xff08;I/O&#xff09;。在 Linux 系统中&#xff0c;文件 I/O 操作更是复杂且关键。 接下来我们将深入探讨…

快速了解Go+rpc

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 文章目录 rpc基础概念GO的rpc应用简单编写json编写rpc rpc基础概念 电商系统…

基于大模型的膀胱肿瘤全周期诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、大模型预测膀胱肿瘤的原理与技术基础 2.1 大模型介绍 2.2 预测原理 2.3 技术支撑 三、术前风险预测与准备方案 3.1 肿瘤分期与恶性程度预测 3.2 患者身体状况评估 3.3 术前准备工作 …

2025年4月个人工作生活总结

本文为 2025年4月工作生活总结。 研发编码 一个项目的临时记录 自2月份领导让我牵头负责一个项目起&#xff0c;在本月算是有较多时间投入——但也是与之前的相比。 月初&#xff0c;清明节前一晚上&#xff0c;因某事务被叫上参加临时紧急远程会议&#xff0c;几方领导都在…

Python爬虫实战:获取软科网最新特定专业大学排名数据并做分析,为高考填报志愿做参考

一、引言 在高考升学的重要阶段,志愿填报成为考生和家长关注的核心问题。准确、全面且具有权威性的大学专业排名数据,是考生做出科学志愿决策的关键依据。软科网作为专业的大学排名信息发布平台,其发布的计算机科学与技术专业排名数据,因具有较高的公信力和参考价值,备受…

自学S32k144(18)————芯片锁死问题及成功解锁流程

1.锁死原因 温度过高flash异常操作静电等电压异常问题。。。。 本人出现情况&#xff1a;之前开发板不知什么原因&#xff0c;发生短路&#xff0c;重新置换芯片后&#xff0c;发现芯片在S32DS中无法正常烧录 判断可能是由于焊接时温度过高导致锁死。需解锁芯片。 2.解决方法…

ISIS的由于L1产生的一系列问题

如果有些名词不清晰可以查看之前文章 L1访问其他区域使用缺省路由会引发次优路径问题&#xff0c;但次优路径leak路由又会引发路由环路问题&#xff0c;下面将会从去缺省路由到路由环路一一解决 Level 1的缺省路由 L1访问其他区域使用缺省路由 --> 引发次优路径 --> 引…

C++继承(下)

目录 一、继承与友元 二、继承与静态成员 三、菱形继承及菱形虚拟继承 1. 继承的方式 2. 菱形继承的问题 3. 菱形虚拟继承 4. 虚拟继承解决数据冗余和二义性的原理 4.1 普通菱形继承的内存布局 4.2 虚拟继承的内存布局 四、继承的总结和反思 1. 多继承的复杂性 2.…

【漫话机器学习系列】233.激活阈(Threshold Activation)

深度学习入门&#xff1a;了解“阈值激活函数”&#xff08;Threshold Activation Function&#xff09; 激活函数是神经网络中至关重要的一环。今天&#xff0c;我们通过一幅简单直观的手绘图&#xff0c;一起理解最早期也最基础的激活函数之一 —— 阈值激活函数&#xff08;…

(4)python中jupyter lab使用python虚拟环境

1. 先了解IPython和IPyKernel简介 IPython 是一个功能强大的交互式 Python 解释器和开发环境。它提供了一种增强的 Python Shell,使得用户能够以交互的方式探索、分析和可视化数据。IPython 的名称来源于 "Interactive Python",体现了其交互式的特性。 IPyKernel 是…

nginx 配置要领

你提出的问题非常好&#xff01;确实在配置 WebSocket 代理时&#xff0c;proxy_pass 的 URL 处理需要特别注意。以下是关键解释和修正建议&#xff1a; 1. 原配置的问题分析 location /ws/ {proxy_pass http://fastapi-container:8000; # 会保留 /ws/ 前缀传递给后端 }这种配…