Freemaker基于word模板动态导出压缩文件汇总整理
Freemaker基于word模板动态导出压缩文件汇总整理
Freemaker基于word模板动态导出单个文件思路和代码详情见连接:
https://www.cnblogs.com/lsy-blogs/p/9243281.html
核心思路如下:
1、service中写方法,查询需要导出的结果list集合数据;
2、控制层中调用service方法获取结果集合数据,调用freemaker获取对应的word文件到临时目录下;
3、利用流处理,将临时目录下导出的每一个word写入到压缩文件中去,利用流输出到浏览器中,实现压缩文件下载;
4、最终将各种流关闭,并将产生的临时word文件删除;
核心是工具类和控制层的调用,核心代码如下:
控制层代码:
@RequestMapping(params = "exportBatchResultScoreWordZip")
public void exportBatchResultScoreWordZip(String ids, HttpServletRequest request,
HttpServletResponse response, DataGrid dataGrid, ModelMap modelMap) {
//获取要批量导出的result_score表的主键id数组
String[] resultScoreIds = ids.split(",");
// 调用service中的方法,获取批量导出word导出需要的目录主表、字段表信息结果集合
List<ProvinceCityResultOneVO> resultOneVOList = tBAssessResultScoreService.getWrodResultListByResultScoreIds(resultScoreIds);
List<Map<String, Object>> wordResultDataMapList = new ArrayList<Map<String, Object>>();
String departLevel = "";
String resultRarFileName = "";
for(int i = ; i < resultOneVOList.size(); i++) {
ProvinceCityResultOneVO resultOneVO = resultOneVOList.get(i);
String appraiseYear = resultOneVO.getAppraiseYear();
String departName = resultOneVO.getDepartName();
String departType = resultOneVO.getDepartType();
String fileName = appraiseYear+"年"+departName+"结果";
Map<String, Object> assessResultMap = new HashMap<String, Object>();
assessResultMap.put("assessResul", resultOneVO);
assessResultMap.put("fileName", fileName);
String templateName = "";
if("".equals(departType)) {
templateName = "provinceResultScoreBatchWordRar.xml";
}else if("".equals(departType)) {
templateName = "cityResultScoreBatchWordRar.xml";
}
if(i==) {
departLevel = departType;
}
assessResultMap.put("templateName", templateName);
wordResultDataMapList.add(assessResultMap);
}
if(StringUtil.isNotEmpty(departLevel)) {
Date nowDate = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String nowDateStr = simpleDateFormat.format(nowDate);
if("".equals(departLevel)) {
//省批量导出压缩文件名称赋值
resultRarFileName = "结果_"+nowDateStr;
}else if("".equals(departLevel)) {
//市批量导出压缩文件名称赋值
resultRarFileName = "结果_"+nowDateStr;
}
}
String resultFileType = "zip";
try {
WordUtils.exportMillCertificateWordZip(request, response, wordResultDataMapList,resultRarFileName,resultFileType);
} catch (IOException e) {
e.printStackTrace();
}
}
word导出工具类代码:
package com.jeecg.assessResultScore.utils; 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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.jeecgframework.core.util.StringUtil; import com.jeecg.assessResultScore.vo.ProvinceCityResultOneVO; 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();
} /**
* 下载单个word文件
* @param request 请求
* @param response 响应
* @param map word结果数据
* @param fileName 结果文件名称(不需要带后缀的)
* @param wordXmlName word模板名称
* @throws IOException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String fileName,String wordXmlName)
throws IOException {
Template freemarkerTemplate = configuration.getTemplate(wordXmlName);
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoc(map, freemarkerTemplate);
fin = new FileInputStream(file);
//根据不同浏览器,对fileName进行不同的编码
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
// win10 ie edge 浏览器 和其他系统的ie
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
// fe
fileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
fileName = fileName+".doc";
response.setHeader("Content-Disposition",
"attachment;filename="+fileName); 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.flush();
out.close();
}
if (file != null) {
file.delete(); // 删除临时文件
}
}
} /**
* 下载批量word文件到一个rar压缩文件中去
* @param request 请求
* @param response 响应
* @param mapList 存放多个word文件的信息:fileName:文件名(不需要带后缀的)、templateName:模板名称、assessResul:数据结果信息的集合
* @param resultRarFileName 最终下载的压缩文件名称
* @param resultFileType 最终下载的压缩文件格式
* @throws IOException
*/
public static void exportMillCertificateWordZip(HttpServletRequest request, HttpServletResponse response, List<Map<String, Object>> mapList,String resultRarFileName,String resultFileType)
throws IOException {
File[] docTempleFiles = new File[mapList.size()];
String[] docTempleFileName = new String[mapList.size()];
ZipOutputStream zipOutputStream = null;
try {
//遍历结果数据集合,将word模板生成的文件保存在临时文件夹中,文件记录在数组中;
for(int i = ; i < mapList.size(); i++) {
String templateName = mapList.get(i).get("templateName").toString();
if(StringUtil.isNotEmpty(templateName)) {
File docFile = new File(templateFolder+UUID.randomUUID().toString()+".doc");
// 创建 FileInputStream 对象
String fileName = mapList.get(i).get("fileName").toString();
ProvinceCityResultOneVO resultOneVO = (ProvinceCityResultOneVO)mapList.get(i).get("assessResul");
Map<String, Object> resultOneVOMap = new HashMap<String, Object>();
resultOneVOMap.put("assessResul", resultOneVO);
// 调用工具类的createDoc方法生成Word文档
Template freemarkerTemplate = configuration.getTemplate(templateName);
docFile = createZipDoc(resultOneVOMap, freemarkerTemplate,docFile);
//将doc文件放到数组中去
docTempleFiles[i] = docFile;
//将doc文件中文名称放到文件名数组中去
docTempleFileName[i] = fileName;
}
}
//根据不同浏览器,对fileName进行不同的编码
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
// win10 ie edge 浏览器 和其他系统的ie
resultRarFileName = URLEncoder.encode(resultRarFileName, "UTF-8");
} else {
// fe
resultRarFileName = new String(resultRarFileName.getBytes("utf-8"), "iso-8859-1");
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
// 设置浏览器以下载的方式处理该文件名
resultRarFileName = resultRarFileName+"."+resultFileType;
response.setHeader("Content-Disposition",
"attachment;filename="+resultRarFileName);
zipOutputStream = new ZipOutputStream(response.getOutputStream());
//遍历文件数组,将文件压缩到zip格式的压缩文件中去,
for(int i = ; i < docTempleFiles.length; i++) {
File docFile = docTempleFiles[i];
FileInputStream fileInputStream = new FileInputStream(docFile);
ZipEntry entry = new ZipEntry(docTempleFileName[i]+".doc");
zipOutputStream.putNextEntry(entry);
int len = -;
byte[] buffer = new byte[];
while ((len = fileInputStream.read(buffer)) != -) {
zipOutputStream.write(buffer, , len);
}
zipOutputStream.closeEntry();
fileInputStream.close();
}
zipOutputStream.flush();
} finally {
if (zipOutputStream != null) {
zipOutputStream.flush();
zipOutputStream.close();
}
for(int i = ; i < docTempleFiles.length; i++) {
docTempleFiles[i].delete();//删除临时doc文件
}
}
} private static File createDoc(Map<String, Object> 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;
} private static File createZipDoc(Map<String, Object> dataMap, Template template,File f) {
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;
}
}
Freemaker基于word模板动态导出压缩文件汇总整理的更多相关文章
- Freemaker基于word模板动态导出汇总整理
Freemaker基于word模板动态导出汇总整理 一.使用的jar包: 二.Word模板动态导出的基本思路: 1.首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容 ...
- JSP利用freemarker生成基于word模板的word文档
利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...
- C# 通过word模板动态生成Word
object oMissing = System.Reflection.Missing.Value; Word._Application oWord = new Word.Application(); ...
- SpringBoot集成文件 - 如何基于POI-tl和word模板导出庞大的Word文件?
前文我们介绍了通过Apache POI通过来导出word的例子:那如果是word模板方式,有没有开源库通过模板方式导出word呢?poi-tl是一个基于Apache POI的Word模板引擎,也是一个 ...
- Excel模板导出之动态导出
说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...
- java动态导出PDF(利用itext)
项目基于ssm框架,使用itext动态导出pdf文件: 1.引入两个jar包:itextpdf-5.5.5.jar.itext-asian-5.2.0.jar 说明: 1.itextpdf-5.5.5 ...
- 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)
https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...
- poi导出word模板项目实例(一个文件)
在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面 <table class="formTa ...
- Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...
随机推荐
- DNS A记录 CNAME NS记录等的区别
DNS域名解析 tracetrt dig A记录 将此域名绑定到固定ip C记录 将此域名绑定到另一个域名上,通常是A记录的别名 AAAA记录 用来绑定ipv6地址 https://www.ezloo ...
- Linux重新挂载磁盘
Linux下磁盘和目录的概念与WIN不同:比如,分了一个系统分区默认挂载了根(/)目录,根下还有其它目录,比如/user /lib等.如果系统分区不够用,可以再分出分支,把根下其它目录分别挂载出来,例 ...
- Appium+Python入门学习总结
最近研究了一下Appium,查看了一些大神的博客,绕过了一些坑,现将从搭建环境到运行真机测试的流程总结如下: 一.搭建环境,这里我参考了虫师的博客,一步一步来,搭好了Appium的环境,如果需要真机测 ...
- java里如何使用输入流和输出流实现读取本地文件里内容和写出到本地文件里
不多说,直接上干货! 第一种方法 PWDemo.java package zhouls.bigdata.DataFeatureSelection.filter; import java.io.File ...
- DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录 专题
首先要做的就是配置域名的MX 记录啦: 先添加一条A记录: mail.abc.com 指向 你的服务器IP! 然后添加域名的MX 记录,指向mail.abc.com A 记录( 即域名MX 记录的值为 ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- 解决Maven依赖下载不全的问题
背景描述 在日常学习过程中使用Maven构建SpringBoot+SpringCloud服务时,有时会使用非正式版的SpringBoot和SpringCloud(非正式版是指不是最终发布的版本,而是测 ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十一天(非原创)
文章大纲 一.课程介绍二.订单系统介绍三.项目源码与资料下载四.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn的使用.(2)第二天:框架的整合 ...
- WPF动画的几种模式
最近在用WPF做简单动画,以下是几点经验总结: 1. 使用DispatcherTimer做动画 VB6的年代大家就用Timer做动画了,不用多解释,这个DispatcherTimer和本身的Timer ...
- 快速获取雪碧图的图标样式插件 - gulp-css-spriter教程
如何快速把合成好的雪碧图,快速获取图标的样式呢? 用gulp-css-spriter很简单. 第一步: 在某个文件夹用shitf+鼠标右键 第二步: npm install gulp-css-spri ...