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. 移动端APP第一次登录和自动登录流程

    App登陆保存数据流程App因为要实现自动登陆功能,所以必然要保存一些凭据,所以比较复杂. App登陆要实现的功能: 密码不会明文存储,并且不能反编绎解密: 在服务器端可以控制App端的登陆有效性,防 ...

  2. DB2的常用数据类型

    今天在db2中查询数据时出现错误: Overflow occurred during numeric data type conversion:SQLCODE=-413, SQLSTATE=22003 ...

  3. vbox 挂载共享文件时可能出现的问题以及对应的解决办法

    VMBox挂载共享文件时可能出现的问题以及对应的解决办法 如果出现“未能加载虚拟光盘***.iso 到虚拟电脑的错误” : 左边一栏,右键光盘,eject,再安装

  4. Spring Cloud微服务初探

    学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...

  5. web 单例 多例

    单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理, ...

  6. Freetype 安装时提示 make: Nothing to be done for `unix'

    [Software-Freetype] Freetype 安装时提示 make: Nothing to be done for `unix' 官网下载的第三方软件包,编译安装会报以下错误,解决办法如下 ...

  7. ElasticSearch之QueryBuilders

    1.termsQuery A filer for a field based on several terms matching on any of them 翻译过来:基于以下几个方面对其中任何匹配 ...

  8. 【踩坑】服务器部署springboot应用时报错--端口被tomcat占用

    今天将本机尬聊一下项目(基于netty-socketio)的服务端程序调试好以后,通过jar包部署在服务器的时候,出现了报错,提示tomcat已经占用了端口. 之前在部署iReview项目时的确是通过 ...

  9. Spring IoC和AOP的介绍

    基于Spring Framework 版本:5.0.2.RELEASE IoC 概念:传统Java开发中,程序通过new主动创建对象实例,而Spring有专门的IoC容器来创建对象,具体来说就是在Sp ...

  10. EEC 欧姆龙PLC输入模块算法

        Option Explicit Public MyArray(20000) As Integer Public MyArraySensor(20000) As Integer Sub 生成输入 ...