java实现word模板导出
Xdocreport和Freemaker生成docx
只使用freemaker生成简单的word文档很容易,但是当word文档需要插入动态图片,带循环数据,且含有富文本时解决起来相对比较复杂,但是使用Xdocreport可以轻易解决。
Xdocreport既可以实现文档填充也可以实现文档转换,此处只介绍其文档填充功能。
步骤:
1.制作模板
以以下文档为例
会议内容为一段富文本
我们需要在变量替换的位置通过快捷键Ctrl+F9 或 工具栏“插入”->“文档部件或文本”->“域”
遇到需要循环的位置
在第一列的里
“@before-row[#list userList as user]”
@after-row[/#list]
遇到图片,先插入一张图片,再为图片添加书签
这样模板就制作完成,不需要保存为xml,ftl。直接使用doc或者docx后缀即可
2.代码实现
引入依赖
<dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>xdocreport</artifactId> <version>2.0.2</version> </dependency>
@RequestMapping(value = "/createXdocreport")
public void createXdocreport(){
createXdocreportService.createXdocreport();
}
//实现类
public static void createXdocreport() {
InputStream inputStream = null;
ServletOutputStream outputStream = response.getOutputStream();
try {
//读取取resource目录下的模板
inputStream = WordUtil.class.getClassLoader().getResourceAsStream("summary.docx");
IXDocReport report = XDocReportRegistry
.getRegistry() .loadReport(inputStream, TemplateEngineKind.Freemarker); // 设置特殊字段 FieldsMetadata metadata = report.createFieldsMetadata(); metadata.addFieldAsTextStyling("content", SyntaxKind.Html); metadata.addFieldAsImage("avatar", "user.avatar", NullImageBehaviour.RemoveImageTemplate); report.setFieldsMetadata(metadata); // 创建内容-text为模版中对应都变量名称 String content = "<p>我在这里放了一段富文本</p>" + "<p>我准备测试富文本的处理</p>"; content = HtmlUtils.htmlUnescape(content); IContext context = report.createContext(); context.put("name", "年终总结大会"); context.put("time", "2021年3月26日"); context.put("place", "线上"); context.put("sponsor", "张三"); context.put("content", content); //图片这里放图片的输入流 InputStream p1 = new FileInputStream(new File("C:\\Users\\luban\\Desktop\\图片1.png")); InputStream p2 = new FileInputStream(new File("C:\\Users\\luban\\Desktop\\图片2.jpg")); List<UserAvatar> users = Lists.newArrayList( new UserAvatar("张三", "组织部", new ByteArrayImageProvider(p1)), new UserAvatar("李四", "宣传部", new ByteArrayImageProvider(p2))); context.put("userList", users); // 生成文件 report.process(context, outputStream);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
String fileName = "warning_task.docx";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
report.process(context, outputStream);
inputStream.close(); outputStream.close(); } catch (Exception e) { log.info("生成纪要文件发生异常:<{}>", e.getMessage()); } }
效果如下
如果发现导出报文件格式错误可以参考:https://www.cnblogs.com/huigee/p/16588297.html