Freemaker基于word模板动态导出汇总整理

一、使用的jar包:

二、Word模板动态导出的基本思路:

1、首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容的地方填写${},大括号内为后台传递进来的参数名,然后将该模板另存为xml格式;

2、对xml格式文件进行适当的修改:

(1)修改${}所在的位置,让${}在一个标签内,因为替换值是根据${}进行识别的,因此必须让${}在一个标签内:

(2)如果有需要循环输出的,需要添加<#list></>标签,类似于增强for循环,无论是表格还是文字只要是需要循环输出的,只要找好循环输出数据的标签,然后用<#list></>扩住,然后修改对应的循环输出数据的${}参数名即可:

三、使用freemaker实现word模板动态导出基本步骤:

1、项目中引入freemaker引擎的jar包:

2、将freemaker导出word的工具类放入项目中,并修改对应的word的xml模板所在的路径和名称:

3、编写代码,获取word中需要的对应的数据,最终存储到一个map中去(参数名必须要与word模板xml中对应的参数名保持一致):

4、编写总方法,将map中的结果数据传递给工具类中的方法,实现word导出;

5、通过以上几个步骤,变可以实现对word的动态导出。

四、需要注意的事项:

1、word模板xml中的${}一定要放在同一个标签中;

2、如果有需要循环输出的数据,在后台中每一条数据一定是放在一个对象中,不要放在一个map中,循环输出的数据在后台是存储在一个list对应集合中;

3、后台给word模板传递参数只能传递一个map参数,因此无论是单个参数还是list对象集合,最终都整合在一个map中进行存储;

4、后台传递给word模板中的参数,不要为null,如果是不存在的值,那么就传递空字符串,也不要传递null进来。

五、word导出工具类代码如下:

package com.jeecg.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import freemarker.template.Configuration;
import freemarker.template.Template; public class WordUtils { // 配置信息,代码本身写的还是很可读的,就不过多注解了
private static Configuration configuration = null;
// 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath()
+ "export/template/";
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
} catch (IOException e) {
e.printStackTrace();
}
} private WordUtils() {
throw new AssertionError();
} public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String fileName)
throws IOException {
Template freemarkerTemplate = configuration.getTemplate("TMCatalogMainTemplateBatchDown.xml");
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoc(map, freemarkerTemplate);
fin = new FileInputStream(file); response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
fileName = fileName+".doc";
response.setHeader("Content-Disposition",
"attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8")))); out = response.getOutputStream();
byte[] buffer = new byte[]; // 缓冲区
int bytesToRead = -;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -) {
out.write(buffer, , bytesToRead);
}
} finally {
if (fin != null)
fin.close();
if (out != null)
out.close();
if (file != null)
file.delete(); // 删除临时文件
}
} private static File createDoc(Map<?, ?> dataMap, Template template) {
String name = "test.doc";
File f = new File(name);
Template t = template;
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;
}
}

六、导出多个word的压缩包,思路详情和代码见连接:

https://www.cnblogs.com/lsy-blogs/p/10173904.html

Freemaker基于word模板动态导出汇总整理的更多相关文章

  1. Freemaker基于word模板动态导出压缩文件汇总整理

    Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...

  2. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  3. C# 通过word模板动态生成Word

    object oMissing = System.Reflection.Missing.Value; Word._Application oWord = new Word.Application(); ...

  4. SpringBoot集成文件 - 如何基于POI-tl和word模板导出庞大的Word文件?

    前文我们介绍了通过Apache POI通过来导出word的例子:那如果是word模板方式,有没有开源库通过模板方式导出word呢?poi-tl是一个基于Apache POI的Word模板引擎,也是一个 ...

  5. Excel模板导出之动态导出

    说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...

  6. 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

    我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...

  7. word 文档导出 (freemaker+jacob)--java开发

    工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶 ...

  8. Net Core DocXCore 实现word模板导出

    实际工作中,往往有这样的需求,需要导出word,还有各种各样的样式,于是有了word模板导出. 实现以下几个需求: 1.表单导出 2.表格导出 3.表单表格混合导出 4.实际用例测试 解决方案: 实现 ...

  9. OpenXml Sdk 根据Word模板导出到word

    一:OpenXml Sdk 简介 Open XML标准的简单介绍:Ecma Office Open XML(“Open XML”)是针对字处理文档.演示文稿和电子表格的国际化开放标准,可免费供多个应用 ...

随机推荐

  1. learn_tmp

    // 4.1构造映射val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -& ...

  2. E - Palindrome Numbers

    题目链接:https://vjudge.net/contest/237394#problem/E A palindrome is a word, number, or phrase that read ...

  3. 【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题

    题目:给定一个圆,要你求出一个在里面或者在边上的整数点,使得这个点到原点的距离最大,如果有多个相同,输出x最大,再输出y最大. 思路:对于一个圆,里面整点个数的x是能确定的.你找到x的上下界就可以了. ...

  4. QT源码解析笔记

    1. QT如何绘制控件的 QT的绘制控件在QStyleSheetStyle::DrawControl里面,这里会调用默认的QSS来绘制效果 2. 在设置一次QSS以后,将会触发polish事件,里面将 ...

  5. {ldelim},{rdelim} - smarty 内建函数

    {ldelim}和{rdelim}用来转义模板的分隔符,缺省为{和}.你也可以用{literal}{/literal}来转义文本块(如Javascript或CSS). 例: {* 在模板外将原样打印分 ...

  6. 会话跟踪之Session

    Session是服务端使用记录客户端状态的一种机制,Session使用简单,但是和Cookie相比,增加了服务器的存储压力[因为为了追求速度,服务器将Session放置在了内存中].Cookie是保存 ...

  7. 获取hudson持续构建编译结果的一种方法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 很多时候使用hudson结合VisualStudio进行持续构建后需要获取持续构建的编译结果,通过编译结果来知道哪些项 ...

  8. <logger>和<root>

    <logger>用来设置某一个包或者具体一个类的日志打印级别.以及制定<appender>.<logger>可以包含零个或者多个<appender-ref&g ...

  9. PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)

    php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...

  10. IBM WebSphere MQ安装及配置详解

    打开MQ安装程序,选择下一步,默认安装WebSphere MQ, 完成MQ的安装工作,启动WebSphere MQ, 服务器配置,选择新建队列管理器,创建名为 "mq"的队列管理器 ...