我如何开发 Doc Java工具,简化文档模板生成
在开发 Excel 模板填充工具 之后,我发现 Word 文档的填充需求同样广泛。许多业务场景需要基于固定模板动态生成文档,例如合同、报表、出口贸易文件等。手动填充这些文档效率低下,且容易出错,因此我决定开发一个 doc
工具,简化 Word 文档模板的生成过程。
核心思路:基于标签解析和数据替换
doc 工具的核心理念是 将模板中的数据用 Map 封装后传入,再解析 Word 模板中的标签并替换数据。
在 Word 模板(.docx
)文件中,我们可以使用类似 #{Map.TradeMode}
、#{Table.CNYSalesAmount}
这样的标签作为占位符,来标识需要填充的数据。例如,Word 文档模板可能包含以下内容:
贸易模式:#{Map.TradeMode}
销售金额:#{Table.CNYSalesAmount}
而在代码中,我设计了 DocUtil.replaceContent
方法来自动填充这些占位符,调用方式如下:
DocUtil.replaceContent(response.getOutputStream(), map,
new ClassPathResource("report/ExportXXXXXXX.docx").getInputStream());
其中,map
是封装后的数据结构,例如:
map.put("#{Map.HSCode}", exportXXXXXXDTO.getHSCode());
map.put("Table", exportXXXXXXXXXXDTOList);
#{Map.HSCode}
这样的标签会被exportXXXXXXDTO.getHSCode()
的值替换。"Table"
代表一组数据,适用于表格填充的情况。
解析 Word 表格中的占位符并替换数据
在 Word 文档中,表格是一个常见的结构,我们需要检查表格中的每一行是否包含 #{Map
这样的标签,并进行替换。以下是核心代码示例:
for (int i = 0; i < xwpfTable.getRows().size(); i++) {
if (checkRowCell(xwpfTable.getRows().get(i), "#{Map")) {
// 遍历该行的所有单元格
for (XWPFTableCell xwpfTableCell : xwpfTable.getRows().get(i).getTableCells()) {
for (XWPFParagraph cellParagraph : xwpfTableCell.getParagraphs()) {
// 替换单元格中的占位符
updateRuns(cellParagraph.getRuns(), replaceMap, "#{Map");
}
}
}
}
代码解析:
- 遍历 Word 文档中的表格行
xwpfTable.getRows().get(i)
。 checkRowCell()
方法检查该行是否包含#{Map
作为占位符。- 如果包含,则遍历该行的每个单元格
xwpfTableCell.getParagraphs()
。 updateRuns()
方法用于替换占位符,将#{Map.xxx}
替换成replaceMap
里的数据。
为什么要用 Map 结构?
- 灵活性:
Map
结构可以动态存储任意类型的数据,不需要预定义字段。 - 解耦模板和数据:模板可以自由调整,不影响代码逻辑。
- 支持表格和列表:不仅能填充单个值,还能处理数据表格的动态填充。
doc 工具的应用场景
- 自动生成合同、协议:比如贸易合同、租赁协议等
- 报表填充:如销售数据报表、财务报表等
- 出口贸易文件:如报关单、发票、提单等
最终的优化效果
✅ 减少手动填充工作量,提升开发效率
✅ 支持不同模板切换,只需调整 Word 文件,无需改动代码
✅ 更易维护,模板逻辑和数据分离,后期扩展更方便
通过 doc 工具,我成功实现了 Word 文档的自动填充,大幅提升了开发效率,也为业务系统带来了极大的便利。 🚀