欢迎来到我的博客

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 = "&#x3c;p&#x3e;我在这里放了一段富文本&#x3c;/p&#x3e;" + "&#x3c;p&#x3e;我准备测试富文本的处理&#x3c;/p&#x3e;"; 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

posted @ 2022-08-15 14:40  八千轮回  阅读(9571)  评论(1编辑  收藏  举报
人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。