Word下载导出

jasmine 于 2023-03-05 发布

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);
}