以下是针对 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。
错误处理
- 捕获
ioexception和invalidformatexception。 - 使用
try-with-resources确保流关闭:
try (xwpfdocument doc = new xwpfdocument();
fileoutputstream out = new fileoutputstream("output.docx")) {
// 操作文档
}
模板引擎整合
复杂文档建议结合 freemarker 或 velocity 模板引擎,避免硬编码样式。
7. 常见问题解决
- 表格边框不显示:需显式设置表格边框属性(poi 默认不显示边框)。
- 生成的文档损坏:确保正确关闭
xwpfdocument和输出流。 - 样式不生效:检查样式名称是否正确,或直接通过
xwpfrun设置样式覆盖。
通过掌握 xwpfdocument 的核心 api 和上述技巧,可以高效生成复杂的 word 文档,满足企业级应用需求。
到此这篇关于java使用xwpfdocument生成word文档的示例代码的文章就介绍到这了,更多相关java xwpfdocument生成word内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论