参考网址:(10条消息) Java导出Word文档的实现_plxddyxnmd的博客-CSDN博客_java导出word
模板:
导出后:
处理模板:
- Word模板中选中要替换的文本,使用 Ctrl + F9 组合键将其设置为域,此时文本会被"{}"包围,接着鼠标右键选择【编辑域(E)...】
- 在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式${sendUserName}
pom文件:
<!--导出word -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.6.0</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.core</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!--指定excel,word文件不编码-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<!-- 需要过滤掉不需要编码的文件:过滤后缀为.xlsx或者.xls的所有文件,不对其进行统一编码-->
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
实现层:
public ResultDto approveWordTest(HttpServletResponse response, ReimbursementFormDTO formDTO) {
Map<String, Object> paramsMap = (Map<String, Object>) formDTO.getParamsMap();
Map<String, Object> baseInfo = (Map<String, Object>) paramsMap.get("baseInfo");
List<Map<String, Object>> formList = (List<Map<String, Object>>) paramsMap.get("form");
ResultDto resultDto = new ResultDto();
try {
InputStream ins = this.getClass().getClassLoader().getResourceAsStream("templates/wordTest.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
context.put("sendUserName", "张三");
context.put("commission", "否");
context.put("date", "2021/11/24");
context.put("payUserName", "李四");
context.put("bankName", "工商银行");
context.put("account", "123456789");
List<WordTest> formTest = new ArrayList<>();
WordTest word1 = new WordTest();
word1.setCost1(999.0);
word1.setCost2(888.0);
word1.setCost3(777.0);
word1.setRemark("说明一下");
WordTest word2 = new WordTest();
word2.setCost1(666.0);
word2.setCost2(555.0);
word2.setCost3(444.0);
word2.setRemark("说明两下");
formTest.add(word1);
formTest.add(word2);
context.put("form", formTest);
//创建字段元数据
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("form", WordTest.class, true);
//浏览器端下载
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
String fileName = "wordTest.docx";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
report.process(context, response.getOutputStream());
resultDto.setCode("200");
resultDto.setMessage("导出成功");
} catch (Exception e) {
resultDto.setCode("400");
resultDto.setMessage("导出失败");
e.printStackTrace();
}
return resultDto;
}