以下是使用Apache POI导出Word文档的完整实现方案:
一、基础环境配置
-
Maven依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>- 需使用
poi-ooxml模块支持.docx格式
- 需使用
-
文档对象模型
XWPFDocument:代表整个Word文档XWPFParagraph:处理段落文本XWPFTable:操作表格结构
二、核心实现方式
1. 基础文档生成
XWPFDocument doc = new XWPFDocument();
// 创建段落
XWPFParagraph p = doc.createParagraph();
XWPFRun run = p.createRun();
run.setText("Hello World");
// 输出文件
FileOutputStream out = new FileOutputStream("output.docx");
doc.write(out);
out.close();
- 通过
XWPFRun设置文本样式(字体、颜色等)
2. 模板替换方案
Map<String, String> data = new HashMap<>();
data.put("name", "张三");
data.put("date", "2025-05-23");
XWPFDocument doc = new XWPFDocument(new FileInputStream("template.docx"));
for (XWPFParagraph p : doc.getParagraphs()) {
String text = p.getText();
for (Map.Entry<String, String> entry : data.entrySet()) {
text = text.replace("${" + entry.getKey() + "}", entry.getValue());
}
p.getRuns().get(0).setText(text, 0);
}
- 需在模板中使用
${key}作为占位符
3. 表格生成示例
XWPFTable table = doc.createTable(3, 2);
table.getRow(0).getCell(0).setText("姓名");
table.getRow(0).getCell(1).setText("年龄");
table.getRow(1).getCell(0).setText("李四");
table.getRow(1).getCell(1).setText("28");
- 通过行列索引操作单元格内容
三、高级功能实现
-
样式控制
XWPFRun run = p.createRun(); run.setBold(true); run.setFontSize(14); run.setFontFamily("宋体");- 支持字体加粗、大小、颜色等属性设置
-
图片插入
run.addPicture(inputStream, XWPFDocument.PICTURE_TYPE_PNG, "image.png", Units.toEMU(200), Units.toEMU(100));- 需指定图片类型(PNG/JPEG)和尺寸
四、方案对比
| 实现方式 | 优点 | 缺点 |
|---|---|---|
| 直接生成 | 灵活控制所有元素 | 代码复杂度高 |
| 模板替换 | 快速实现格式保留 | 需预先制作模板文件 |
| POI-TL扩展库 | 支持复杂模板语法 | 需额外学习新API |
五、常见问题处理
-
中文乱码
- 确保模板文件编码为UTF-8
- 输出时设置响应头:
response.setContentType("application/msword;charset=UTF-8");
-
性能优化
- 大数据量导出时采用分页处理
- 复用
XWPFDocument对象减少内存开销
以上方案可根据实际需求组合使用,建议复杂场景优先选择模板替换方案。
5233

被折叠的 条评论
为什么被折叠?



