使用FreeMarker导出固定格式word文档
使用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 >
,具体效果如下:
- 需要循环生成选出的人员名+空格,而不是一整行。
<w:p>
代表一行
- 需要循环一行生成人员名。
<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文档相关推荐
- 【Python】导出docx格式Word文档中的文本、图片和附件等
[Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...
- java导出excel与word文档
导出excel与word 依赖如下 <!--导出excel文档,easyexcel的依赖:为了防止poi版本冲突--><dependency><groupId>co ...
- java+vue实现前后端导出html的word文档
java+vue实现前后端导出html的word文档 该内容主要是完成项目中实战导出word文档,而且不需要其他的依赖,原生的写法即可! 本项目架构: PS:不是这个架构的话看下逻辑就好,赶紧找别的博 ...
- freemarker根据模板生成word文档,换行
freemarker根据模板生成word文档,其它地方已经说的非常清除了,在此简单再说以下. 1.制作word模板,另存为xml文件.在此我另存为的时windows xml,它和windows 200 ...
- 如何将多个 Docx 格式 Word 文档批量转为 Doc 格式
概要:前面我们介绍过常见的 Word 文档有多种格式,比如 Doc.Docx,并且详细介绍了如何批量将多个 Doc 格式的 Word 文档批量转为 Docx 格式文档,相信对大家都有一些的帮助.那 D ...
- Python批量提取docx格式Word文档中所有批注
封面图片:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配 ...
- docx格式word文档打不开问题的解决
注册表里"计算机\HKEY_CLASSES_ROOT.docx""的WPS.Docx.6改为Word.Document.12可以解决右键新建的docx格式word文档打不 ...
- java 导出word 带格式_java 导出数据为word文档(保持模板格式)
导出数据到具体的word文档里面,word有一定的格式,需要保持不变 这里使用freemarker来实现: ①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换 如 aaaaa ...
- java实现导出内容不固定的word文档
之前遇到过一个需求,需要导出一个word的周报,周报的内容是可变,然后网上找了下方法,下面摘抄一种方便的实现手段: Java用freemarker导出word 一.模板的制作 先用Word做一个模板, ...
最新文章
- BZOJ2653 middle 【主席树】【二分】*
- 皮一皮:六神终于出奶茶了!
- iphone6 充电电流测试软件,iPhone7支持快充? 9个充电器数据实测
- python%20开发工具_20招让你的Python飞起来!
- 你应该知道这些有意思的代码
- 如何修改操作系统运行服务器,如何设置Bios 最常见bios设置与修改详细图解教程...
- Java利用jenkins做项目的自动化部署
- Gemini创始人:如果我是GameStop CEO 接下来我会买BTC
- Mac和Xcode常用的快捷键
- vue 数据劫持 响应式原理 Observer Dep Watcher
- 多媒体制作技术心得体会_多媒体课件制作的学习心得体会
- 一文搞懂VOS3000如何配置MicroSIP网络电话
- SDU创新实训 6.实现中文拼音模糊匹配
- 7-5 华氏度转摄氏度(四舍五入) (5分) java pta
- 白蛇传 冯梦龙 警世通言
- 数据挖掘是什么,数据挖掘的学习路线是什么?
- 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 - 左潇龙 - 博客园...
- “打怪升级”,电竞浪潮中一家非典型公司的生存之道
- IBM MQ简单开发和应用
- 软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据