1. 实现思路
有一个word模板,其中word模板中有变量信息,程序读出来,然后将变量信息替换,返回流给前端,实现word下载
2. 工具包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.5</version>
</dependency>
3. word模板放到resource目录下
4. 下载word的service
@Override
public ResponseEntity<byte[]> dowmloadVerificationLetter(AutCredentialPrintInfoEditModel autCredentialPrintInfoEditModel) {
log.info("下载word证书打印信息入参autCredentialPrintInfoEditModel:{}", JsonUtils.toString(autCredentialPrintInfoEditModel));
//读取模板
ClassPathResource resource = new ClassPathResource("credential_model.doc");
//初始化占位符和参数
Map<String, String> placeholders = initParamPlaceholders(autCredentialPrintInfoEditModel);
try (InputStream inputStream = resource.getInputStream();
HWPFDocument document = new HWPFDocument(inputStream)) {
Range bodyRange = document.getRange();
//替换占位符
for (Map.Entry<String, String> entry : placeholders.entrySet()) {
bodyRange.replaceText(entry.getKey(), entry.getValue());
}
//写到stream中
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
document.write(ostream);
//写到response中
String newFilename = URLEncoder.encode(String.format("%s-%s", autCredentialPrintInfoEditModel.getName(),
LocalDateUtils.getLocalDateTimeStr(LocalDateUtils.UNSIGNED_DATETIME_PATTERN)), StandardCharsets.UTF_8.name());
ResponseEntity<byte[]> body = ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + newFilename + ".doc")
.body(ostream.toByteArray());
return body;
} catch (IOException e) {
log.error("下载word失败", e);
throw new MKException("下载word证书失败,请稍后重试");
}
}
private static Map<String, String> initParamPlaceholders(AutCredentialPrintInfoEditModel autCredentialPrintInfoEditModel) {
Map<String, String> placeholders = new HashMap<>();
placeholders.put("${applyDate}", autCredentialPrintInfoEditModel.getApplyDate());
placeholders.put("${credentialCode}", autCredentialPrintInfoEditModel.getCredentialCode());
placeholders.put("${content}", autCredentialPrintInfoEditModel.getContent());
placeholders.put("${formeName}", autCredentialPrintInfoEditModel.getFormeName());
placeholders.put("${formjon}", autCredentialPrintInfoEditModel.getFormjon());
return placeholders;
}
5. controller层接口
@PostMapping("/dowmloadVerificationLetter")
@ApiOperation("认定函下载【下载】按钮")
public ResponseEntity<byte[]> dowmloadVerificationLetter(@RequestBody AutCredentialPrintInfoEditModel autCredentialPrintInfoEditModel) {
return autCredentialPrintInfoService.dowmloadVerificationLetter(autCredentialPrintInfoEditModel);
}