这是一个使用 Apache POI 开源库进行文书模板生成的模块。
需要修改 Word 文档,使其成为一个模板,才能使用这个包。
模板中需要动态添加的字段或表格,使用 ${key} 代替,。
其中,key 可以替换为自己的字段,key 称为“模板键”。
为了提高开发效率,对模板键的设置做如下约定:
- 单字段(
DocElementField)使用${EL_}开头的模板键(如${EL_recorder}) - 表格(
DocTableField)使用${TB_}开头的模板键(如${TB_indicators})
这样做的目的是,可以让一个人去做 Word 模板,另一个人去针对每个 Word 文书制作生成器(
DocGenerator)。
示例:
为了避免格式错误,应充分使用制表位、�边距、对齐方式 等 Word 格式设置代替原文档中的大量空格。
下面是模块中的所有类:
IDocField接口:表示文档中的字段。DocElementField类:单子段。DocTableField类:表格。
DocFieldType枚举:表示文档字段的类型。DocTableFieldHeader类:表示表头。DocTableFieldCell类:表示表单元格。DocGenerator类:文档渲染器。
类的详细信息可参考 JavaDoc。
创建 DocGenerator 对象,设置其以下属性:
docPath:源文档路径。docSavePath:生成文档的保存路径。fieldMap:字段映射,为键值对形式。键即为文档模板键,值为IDocField对象。
然后调用 loadDocument() 方法加载文档,使用 replaceInDoc() �方法生成文档。
完成示例如下:
package com.zkty.hbh;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
public class App
{
public static void main( String[] args )
{
DocGenerator generator = new DocGenerator();
generator.docPath = "/formCaseSource.docx";
generator.docSavePath = "/formCaseSource-output.docx";
generator.fieldMap.put("${EL_reportYear}", new DocElementField("2017"));
generator.fieldMap.put("${EL_reportMonth}", new DocElementField("3"));
generator.fieldMap.put("${EL_reportDay}", new DocElementField("19"));
generator.fieldMap.put("${EL_reportHour}", new DocElementField("19"));
// 创建表格参数
List<DocTableFieldHeader> headerMap = new ArrayList<DocTableFieldHeader>();
headerMap.add(new DocTableFieldHeader("test1", "测试1"));
headerMap.add(new DocTableFieldHeader("test2", "测试2"));
headerMap.add(new DocTableFieldHeader("test3", "测试3"));
DocTableFieldHeader header4 = new DocTableFieldHeader("test4", "测试4");
header4.width = 2000;
headerMap.add(header4);
headerMap.add(new DocTableFieldHeader("test5", "测试5"));
List<Map<String, DocTableFieldCell>> contentMap = new ArrayList<Map<String, DocTableFieldCell>>();
for (int i = 0; i < 10; i++) {
Map<String, DocTableFieldCell> content = new HashMap<String, DocTableFieldCell>();
for (int j = 0; j < 5; j++) {
content.put("test" + (j + 1), new DocTableFieldCell(("测试内容" + (i + 1)) + (j + 1)));
}
contentMap.add(content);
}
generator.fieldMap.put("${TB_demo}", new DocTableField(headerMap, contentMap));
try {
generator.loadDocument();
generator.showDocument();
generator.replaceInDoc();
generator.showDocument();
generator.saveDocument();
} catch (IOException e) {
System.out.println("Open document filed!");
e.printStackTrace();
}
}
}如果当前定义的�两个字段类渲染出的样式无法满足需求,�可以从其派生,
�派生后添加自己的��属性,�然后重载 setStyle() 函数,自定义样式。
生成效果图示

