1、引入依赖,同步使用hutool工具进行开发
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
2、替换模板的方法
// 模板文件路径
File tempFile = new File(templatePath);
FileUtils.copyInputStreamToFile(in, tempFile);
// 生成word的路径
String fileDir = getClass().getClassLoader().getResource("").getPath();
// 生成word的文件
String fileName = UUID.randomUUID().toString().replace("-", "") + "_create." + templateAttach.getSuffix();
// 核心替换逻辑
String wordPath = createWord(templatePath, fileDir, fileName, param);
wordPath = wordPath.replace("\\", "/");
3、核心替换逻辑
public String createWord(String templatePath, String fileDir, String fileName, ContractWordTplReplaceParam param) {
Assert.notNull(templatePath, "word模板文件路径不能为空");
Assert.notNull(fileDir, "生成的文件存放地址不能为空");
Assert.notNull(fileName, "生成的文件名不能为空");
File dir = new File(fileDir);
if (!dir.exists()) {
log.info("目录不存在,创建文件夹{}!", fileDir);
dir.mkdirs();
}
String filePath = fileDir +"\\"+ fileName;
Map<String, Object> paramMap = new HashMap<>();
// 基础信息
paramMap.put("title", param.getTitle());
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
String nowDate = dateFormat.format(new Date());
paramMap.put("createTime", nowDate);
DictDataItemQueryParam dictParam = new DictDataItemQueryParam();
dictParam.setDictType("mg_contract_type");
dictParam.setDictValue(param.getType());
DictDataDto type = dictDataFeign.queryByTypeValue(dictParam).getData();
paramMap.put("type", type.getDictLabel());
dictParam.setDictType("mg_range_type");
dictParam.setDictValue(String.valueOf(param.getRangeType()));
DictDataDto rangeType = dictDataFeign.queryByTypeValue(dictParam).getData();
paramMap.put("rangeType", rangeType.getDictLabel());
paramMap.put("startTime", dateFormat.format(param.getStartTime()));
paramMap.put("endTime", dateFormat.format(param.getStartTime()));
paramMap.put("summary", param.getSummary());
paramMap.put("amount", param.getAmount());
// 列表循环
paramMap.put("signList", param.getSignList());
paramMap.put("productList", param.getProductList());
paramMap.put("costList", param.getCostList());
paramMap.put("expenseList", param.getExpenseList());
// 读取模板渲染参数
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("signList", policy)
.bind("productList", policy)
.bind("costList", policy)
.bind("expenseList", policy)
.build();
XWPFTemplate template = XWPFTemplate.compile(templatePath, config)
.render(paramMap);
try {
// 将模板参数写入路径
template.writeToFile(filePath);
template.close();
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
4、替换模板
文件没有办法上传,具体的可以参考百度,支持文本、列表、图片(实际上是特殊文本)的替换。