使用FreeMarker导出固定格式word文档

一.下载FreeMarker的jar包

下载地址:http://freemarker.org/freemarkerdownload.html,导入项目,报错的自行搜索缺少的jar包。

二.修改word文档

将需要替换的使用freemarker的占位符替换,类似EL表达式,不同是的对于循环遍历,if判断,freemarker有自己的格式。对于需要对list遍历生成的,word文档里使用参变量,后面在xml文件里额外定义参变量。修改后的具体格式如下:

三.将修改后的word文档保存成xml格式

使用word编辑好后,保存文档,将文档另存为xml格式,具体如下图:

四.使用编辑工具打开xml,修改被分割的占位符

使用notepad或者visulcode打开xml文档,将占位符被分割的,删除中间的word标签,只有完整占位符才会被freemarker解析。

五.对于集合元素

首先在xml中,需要确定循环的具体循环体,防止循环结果错误,找到正确循环体后,在头和尾部额外插入标签。<#list 集合 as 参数名> </#list >,具体效果如下:

  1. 需要循环生成选出的人员名+空格,而不是一整行。<w:p>代表一行
  2. 需要循环一行生成人员名。<w:tr>代表一个表格tr

六.将修改好的xml文档,保存后,直接修改文件名,保存成resume.ftl

需要修改后缀名,window询问是否保存,点击是,即可。

七.创建导出工具类

将上一步生产的resume.ftl文件,复制到工具包下,创建工具类用于导出word,直接复制如下代码:

package com.yh.common.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;  public class WordGenerator {private static Configuration configuration = null;  private static Map<String, Template> allTemplates = null;  static {  configuration = new Configuration();  configuration.setDefaultEncoding("utf-8");  configuration.setClassForTemplateLoading(WordGenerator.class, "/com/yh/common/util");  allTemplates = new HashMap<>();   // Java 7 钻石语法  try {  allTemplates.put("resume", configuration.getTemplate("resume.ftl"));  } catch (IOException e) {  e.printStackTrace();  throw new RuntimeException(e);  }  }  private WordGenerator() {  throw new AssertionError();  }  public static File createDoc(Map<?, ?> dataMap, String type) {  String name = "temp" + (int) (Math.random() * 100000) + ".doc";  File f = new File(name);  Template t = allTemplates.get(type);  try {  // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开  Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");  t.process(dataMap, w);  w.close();  } catch (Exception ex) {  ex.printStackTrace();  throw new RuntimeException(ex);  }  return f;  }
}

八.控制层写法

开发时,使用的struct,提供struct的写法。其中父类中包括了获取response和request的方法,这边可以在方法参数里面添加,读者根据具体情况自行修改。

public String exportWord()  throws ServletException, IOException { HttpServletResponse resp = ServletActionContext.getResponse();request.setCharacterEncoding("utf-8");  Map<String, Object> map = new HashMap<String, Object>(); //查询评审场次信息List list1 = ?;if(!ValidateUtil.isEmpty(list1)){map.put("list1", list1);}//查询轮次信息map.put("round", ?);List list2 = ?;if(!ValidateUtil.isEmpty(list2)){map.put("list2", list2);}List list3 = ?;if(!ValidateUtil.isEmpty(list3)){map.put("list3", list3);}//投票产生的人数String expertNumber= ?;map.put("expertNumber", expertNumber);//总人数String number = ?;map.put("number", number);String filename = ?;//可以是中文// 提示:在调用工具类生成Word文档之前应当检查所有字段是否完整  // 否则Freemarker的模板殷勤在处理时可能会因为找不到值而报错 这里暂时忽略这个步骤了  File file = null;  InputStream fin = null;  ServletOutputStream out = null;  try {  // 调用工具类WordGenerator的createDoc方法生成Word文档  file = WordGenerator.createDoc(map, "resume");  fin = new FileInputStream(file);  resp.setCharacterEncoding("utf-8");  resp.setContentType("application/msword");  // 设置浏览器以下载的方式处理该文件默认名为filename.doc  String fileName = "attachment; filename= "+new String(filename.getBytes(), "ISO-8859-1")+".doc";//转化中文,防止中文文件名导致下载文件文件名异常或者没有后缀名resp.addHeader("Content-Disposition", fileName);  out = resp.getOutputStream();  byte[] buffer = new byte[512];  // 缓冲区  int bytesToRead = -1;  // 通过循环将读入的Word文件的内容输出到浏览器中  while((bytesToRead = fin.read(buffer)) != -1) {  out.write(buffer, 0, bytesToRead);  }  } finally {  if(fin != null) fin.close();  if(out != null) out.close();  if(file != null) file.delete(); // 删除临时文件  }  return SUCCESS;}

九.jsp写法

页面调用一个同步方法,到控制层即可导出文件。

10.生成效果

使用FreeMarker导出固定格式word文档相关推荐

  1. 【Python】导出docx格式Word文档中的文本、图片和附件等

    [Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...

  2. java导出excel与word文档

    导出excel与word 依赖如下 <!--导出excel文档,easyexcel的依赖:为了防止poi版本冲突--><dependency><groupId>co ...

  3. java+vue实现前后端导出html的word文档

    java+vue实现前后端导出html的word文档 该内容主要是完成项目中实战导出word文档,而且不需要其他的依赖,原生的写法即可! 本项目架构: PS:不是这个架构的话看下逻辑就好,赶紧找别的博 ...

  4. freemarker根据模板生成word文档,换行

    freemarker根据模板生成word文档,其它地方已经说的非常清除了,在此简单再说以下. 1.制作word模板,另存为xml文件.在此我另存为的时windows xml,它和windows 200 ...

  5. 如何将多个 Docx 格式 Word 文档批量转为 Doc 格式

    概要:前面我们介绍过常见的 Word 文档有多种格式,比如 Doc.Docx,并且详细介绍了如何批量将多个 Doc 格式的 Word 文档批量转为 Docx 格式文档,相信对大家都有一些的帮助.那 D ...

  6. Python批量提取docx格式Word文档中所有批注

    封面图片:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配 ...

  7. docx格式word文档打不开问题的解决

    注册表里"计算机\HKEY_CLASSES_ROOT.docx""的WPS.Docx.6改为Word.Document.12可以解决右键新建的docx格式word文档打不 ...

  8. java 导出word 带格式_java 导出数据为word文档(保持模板格式)

    导出数据到具体的word文档里面,word有一定的格式,需要保持不变 这里使用freemarker来实现: ①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换  如  aaaaa ...

  9. java实现导出内容不固定的word文档

    之前遇到过一个需求,需要导出一个word的周报,周报的内容是可变,然后网上找了下方法,下面摘抄一种方便的实现手段: Java用freemarker导出word 一.模板的制作 先用Word做一个模板, ...

最新文章

  1. BZOJ2653 middle 【主席树】【二分】*
  2. 皮一皮:六神终于出奶茶了!
  3. iphone6 充电电流测试软件,iPhone7支持快充? 9个充电器数据实测
  4. python%20开发工具_20招让你的Python飞起来!
  5. 你应该知道这些有意思的代码
  6. 如何修改操作系统运行服务器,如何设置Bios 最常见bios设置与修改详细图解教程...
  7. Java利用jenkins做项目的自动化部署
  8. Gemini创始人:如果我是GameStop CEO 接下来我会买BTC
  9. Mac和Xcode常用的快捷键
  10. vue 数据劫持 响应式原理 Observer Dep Watcher
  11. 多媒体制作技术心得体会_多媒体课件制作的学习心得体会
  12. 一文搞懂VOS3000如何配置MicroSIP网络电话
  13. SDU创新实训 6.实现中文拼音模糊匹配
  14. 7-5 华氏度转摄氏度(四舍五入) (5分) java pta
  15. 白蛇传 冯梦龙 警世通言
  16. 数据挖掘是什么,数据挖掘的学习路线是什么?
  17. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 - 左潇龙 - 博客园...
  18. “打怪升级”,电竞浪潮中一家非典型公司的生存之道
  19. IBM MQ简单开发和应用
  20. 软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据

热门文章

  1. 汇编c语言基础教程编程达人,编程达人 《汇编、C语言基础教程》第二章 汇编基础2.2 寄存器...
  2. 微信小程序开发语言(微信小程序开发教程)详细步骤
  3. JavaScript数组常用方法总结及使用详解
  4. 【爱思考】CISP证书有效期是几年,到期后怎么办
  5. MySQL联合索引以及索引顺序优化
  6. 使用selenium进行模拟登录
  7. 【聚英云农】无线节水灌溉系统应用智慧农业
  8. 印象深刻的一个人450作文_印象深刻的一个人作文450字
  9. PCA(主成分分析法)的理解笔记及算法的实现
  10. 网站服务器端口扫描,服务器端口扫描工具