利用freemarker模板导出单个word及多word压缩导出到浏览器下载

使用freemark模板生成word,之后导出压缩包 freemark生成word,前端导出压缩包zip,前端代码: $("#exprotStaffZip").click(exprotStaffZipFun); function exprotStaffZipFun(){ var data=table.checkStatus("archivesTable").data; if(data.length<=0){ ... 阅读详情

1、后端代码

@RequestMapping(value = { "wordMultipleExport" }, method = {RequestMethod.POST})
	public Result createMultipleWord(@RequestBody Map<String, Object> params,HttpServletRequest request,HttpServletResponse response)throws Exception {
		String fileName = params.get("fileName").toString();
		List<Map<String, Object>> templateNameList = (List<Map<String, Object>>) params.get("templateNameList");
		Map<String, Object> data = (Map<String, Object>) params.get("data");
		String msg="";
		System.err.println(fileName+"111");
		System.err.println(templateNameList+"222");
		System.err.println(data+"333");
		if (templateNameList.size()>1) {
			//多文件生成zip压缩包
			zipUtils.exportMillCertificateWordZip(request, response, templateNameList,data, fileName, "zip");
			
		}else {
			//单文件直接生成word文档
			try {
				zipUtils.exportMillCertificateWord(request, response, data,templateNameList.get(0).get("fileName").toString(), templateNameList.get(0).get("templateName").toString());
				msg = "生成word完毕!";
			} catch (Exception e) {
				msg = "生成word失败!";
				e.printStackTrace();
			}
		}
	    
		return Result.error(msg);
		
	}

2.前端代码

//导出数据
				exportData () {
	
					var params = {
						data : {
							project_name : "测试项目", //项目名称
							construction_unit : "测试建设单位", //建设单位
							edit_date : "2020年3月16日", //编制日期
							evaluate_unit : "评价单位" //评价单位
						},
						templateNameList : [
                            {fileName:"报告1.doc",templateName:"报告1.ftl"},
						    {fileName:"报告2.doc",templateName:"报告2.ftl"},
						    {fileName:"报告3.doc",templateName:"报告3.ftl"}
							], 
							/* templateNameList : [
							"1、报告表封面(建设单位公章)--6份.ftl"
							], */
						fileName : "全部报告"
					}
					return axios({
						method : 'post',
						url : baseURL + 'api/wordMultipleExport',
						data : params,
						responseType : 'blob'
					}).then((response) => {
						// 处理返回的文件流
						const data = new Blob([ response.data ], {
							type : "application/msword"
						}); //,{type: 'application/vnd.ms-excel;charset=utf-8'}
	
						let fileName = "全部报告.zip";
						if (params.templateNameList.length == 1) {
							fileName = "全部报告.doc";
						}
						if (typeof window.chrome !== 'undefined') {
							// Chrome version
							var link = document.createElement('a');
							link.href = window.URL.createObjectURL(data);
							link.download = fileName;
							link.click();
						} else if (typeof window.navigator.msSaveBlob !== 'undefined') {
							// IE version
							var blob = new Blob([ data ], {
								type : 'application/force-download'
							});
							window.navigator.msSaveBlob(blob, fileName);
						} else {
							// Firefox version
							var file = new File([ data ], fileName, {
								type : 'application/force-download'
							});
							window.open(URL.createObjectURL(file));
						}
	
	
					}
					);
	
	
				}

工具类:

/**
 * 
 */
package shqn.hbxt.modules.environment.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 freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * @author hxl
 * @date 2020年3月16日 zipUtil.java
 */
public class zipUtils {
	
	    private static Configuration configuration = null;
	    // 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
	    private static final String templateFolder = zipUtils.class.getClassLoader().getResource("templates/word/").getPath();
	    
	    static {
	        configuration = new Configuration();
	        configuration.setDefaultEncoding("utf-8");
	        try {
	            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }

	    private zipUtils() {
	        throw new AssertionError();
	    }

	    /**
	     * 下载单个word文件
	     * @param request 请求
	     * @param response 响应
	     * @param map word结果数据
	     * @param fileName 结果文件名称(不需要带后缀的)
	     * @param templateName word模板名称
	     * @throws IOException
	     */
	    @SuppressWarnings({ "rawtypes", "unchecked" })
	    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map<String, Object> dataMap,String fileName,String templateName)
	            throws IOException {
	        Template freemarkerTemplate = configuration.getTemplate(templateName);
	        File file = null;
	        InputStream fin = null;
	        ServletOutputStream out = null;
	        try {
	            // 调用工具类的createDoc方法生成Word文档
	            file = createDoc(dataMap, 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[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.flush();
	                out.close();
	            }
	            if (file != null) {
	                file.delete(); // 删除临时文件
	            }
	        }
	    }
	    
	    /**
	     * 下载批量word文件到一个rar压缩文件中去
	     * @param request 请求
	     * @param response 响应
	     * @param mapList 存放多个word文件的信息:fileName:文件名(不需要带后缀的)、templateName:模板名称、assessResul:数据结果信息的集合
	     * @param data 数据结果信息
	     * @param resultRarFileName 最终下载的压缩文件名称
	     * @param resultFileType 最终下载的压缩文件格式
	     * @throws IOException
	     */
	    public static void exportMillCertificateWordZip(HttpServletRequest request, HttpServletResponse response, List<Map<String, Object>> mapList,Map<String, Object> data,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 = 0; i < mapList.size(); i++) {
	                String templateName = mapList.get(i).get("templateName").toString();
	                if(Utils.isNotEmpty(templateName)) {
	                    File docFile = new File(templateFolder+UUID.randomUUID().toString()+".doc");
	                    // 创建 FileInputStream 对象
	                    String fileName = mapList.get(i).get("fileName").toString();
	                    // 调用工具类的createDoc方法生成Word文档
	                    Template freemarkerTemplate = configuration.getTemplate(templateName);
	                    docFile = createZipDoc(data, 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 = 0; 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 = -1;
	                byte[] buffer = new byte[1024];
	                while ((len = fileInputStream.read(buffer)) != -1) {
	                    zipOutputStream.write(buffer, 0, len);
	                }
	                zipOutputStream.closeEntry();
	                fileInputStream.close();
	            }
	            zipOutputStream.flush();
	        } finally {
	            if (zipOutputStream != null) {
	                zipOutputStream.flush();
	                zipOutputStream.close();
	            }
	            
	            System.err.println(docTempleFiles.length+"__________________文件数量");
	            for(int i = 0; i < docTempleFiles.length; i++) {
	            	System.err.println("删除第"+i+"个文件");
	            	if (docTempleFiles[i] != null) {
	            		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;
	    }
}

 

Java利用freemarker导出带有图片的word文档 1.使用Microsoft Office Word编辑word模板,把需要动态修改的内容替换成${xxxxxx},如果有图片,尽量选择较小的图片几十K左右,并调整好位置及大小 图1 模板示例 注意: 1.变量需要使用${},例如:${CORP_ADDR} 2.将word文件另存为Word 2003 XML文档格式 ... 阅读详情

相关推荐

springboot整合freemarker根据模板导出word,pdf,以及word转pdf,读取工程resources下的模板文件,并导出压缩包zip

springboot整合freemarker根据模板导出word,pdf,以及word转pdf,读取工程resources下的模板文件,并导出压缩包zip

迷茫,是因为才华配不上梦想... 1763

java web 使用 Freemarker 导出word,zip包导出多个word

       曾经使用POI做过导出excel的功能,有次客户需要做导出word。使用过POI 导出excel都知道, POI可以根据每行row提供第n个单元格cell操作的。但word 又不像excel 那样一格一格的那么整齐, 想把数据填到特定的地方还比较麻烦,所以,想到了Freemarker。 1.制作word的ftl模板       将word要填充数据的地方用***代替,然后另存为Wo...

zjz_zZzZ的博客 2812

freemaker导出多个word格式doc压缩文件.rar

freemaker导出单个word格式doc,包含生成doc,以及导出单个、多个word压缩文件。

基于Freemarker模板引擎生成多个Word文件(doc格式),并压缩成Zip格式导出

基于Freemarker模板引擎生成多个Word文件(doc格式),并压缩成Zip格式导出 一、前言   之前做项目遇到一个导出word并压缩成zip的功能需求,当时翻了不少百度文章,没找到系统、详尽的实操教学,现在项目做完了,我就在这做一个简单的总结吧。 二、环境 SpringBoot + Vue + Linux <!--依赖--> <dependency> <groupId>o...

Super_King_的博客 1812

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

智能环境感知:STM32多传感器数据融合与报警策略设计

本文详细介绍了基于STM32的多传感器数据融合系统设计,整合DHT11温湿度传感器、MQ-2烟雾检测和光照强度检测模块,通过智能算法实现环境感知与动态报警。系统采用数据滤波、多传感器校验和自适应阈值策略,显著提升监测精度与可靠性,并通过OLED显示屏提供清晰的多级报警界面。

plant的博客 202

【Java】用Freemarker完美导出word文档(带图片)

Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题。 准备材料 1.word原件 2.编辑器(推荐Firstobject free XML editor) 实现步骤 1.用Microsoft Office Word打开word原件; 2.把...

weixin_30632899的博客 492

iSLIP算法实战:如何用Python模拟交换机优先级匹配(附完整代码)

本文详细介绍了如何使用Python实现iSLIP算法,模拟交换机优先级匹配过程。通过核心的指针滑动逻辑和迭代循环策略,构建了一个完整的iSLIP算法模拟器,并加入可视化模块以直观展示匹配过程。文章还提供了完整的代码框架和性能优化建议,适合网络工程师和Python开发者直接集成到测试环境中。

weixin_29313239的博客 252

freemarker批量导出word文档,区分多文件

java 后台代码: 1,lock锁,不然会报io移除,强制主机关闭 package com.yx.service.common.lock; import com.yx.service.common.redis.RedisService; import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.core.script.DefaultRedisScript; import o

camel_gold的博客 623

如何理解Fourier Neural Operator (FNO)

2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了更好的理解模型的理论基础,可以详细学习一下以及他的前期工作GNOFNO作者对这两篇文章的解析blog。

momo的博客 1万+

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3457

【三十二】springboot+freemarker实现按模板导出word

springboot+freemarker实现按模板导出word

weixin_56995925的博客 1964

【26美赛C题】Data With The Stars第三问[影响因素分析模型]思路与代码

本文针对2026美赛C题《Dancing with the Stars》第二问,提出了一套系统的影响因素分析框架。通过多元回归模型和固定效应模型,量化分析了明星特征(年龄、职业等)、舞者搭档和比赛周次对评分的影响,发现评委与观众偏好存在差异。研究采用方差分解评估舞者效应占比,通过最优年龄分析和交互效应检验揭示非线性关系。最后运用差异性检验和结构方程模型(SEM)比较评委与观众偏好,为比赛结果预测和选手优化提供量化依据。该分析框架可系统揭示比赛成绩的关键驱动因素。

一键难忘的博客 757

freeMarker导出word带图片

1.maven导入需要的jar包 <!-- 引入freeMarker的依赖包. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 2.word模板另存为xml格式 3.写word导出工

ZHANGLIZENG的博客 1129

v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码

相比动态分配,静态内存池的分配就是个小弟弟,非常的简单,两个结构体 + 一张图 就能说明白。

日拱一卒,力出一孔 775

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1600

Freemarker 导出word

需求: Java 实现 Word 导出功能 准备 Freemarker 的 .ftl 模板文件 ① 先编写好 Word 模板 ② 编写实体类 根据需要导出的 Word 模板编写对应的实体类。 public class TaskNotice{ private Integer id; private Integer projectId; private String number; private String projectName; //省略..... }

起于山野之风 728

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java导出多个Word到指定路径,再生成压缩包从浏览器下载下来

思路:先逐个导出Word文件到服务器,再压缩,再返回给用户下载。 (导出Word用的是freemarker模板导出形式,这里不再赘述) 直接贴代码: Controller文件: @ApiOperation("同时导出多个Word文件") @GetMapping("/exportZip") public void exportZip(String instrumentIds, HttpServletRequest request, HttpServletResponse respon

lllll520520520520520的博客 1864

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java通过freemarker生成word文档

文档生成目录摘要二级目录三级目录 摘要 二级目录 三级目录

qq_34377273的博客 2345

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ftl文件模板图片_JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载...

引入jar包,freemarker.jar、apache-ant-zip-1.8.0.jar(制作压缩包使用)或者mavenorg.freemarkerfreemarker2.3.23org.apache.antant1.8.01、准备ftl模板,先在一个word中模板排版好,然后另存为-保存成“Word 2003 XML文档” 后缀名是.xml的文件注:模板中的值要使用占位符进行填充 ,如下图所...

weixin_39728213的博客 782

java freemarker 根据xml模板生成word,浏览器下载产生多余的代码问题

问题描述:不管是wps生成的xml模板还是office生成的xml模板,下载的时候都会追加多余的代码,导致office打开有问题如图找了很久,终于发现和生成的word没啥关系,和浏览器下载的时候回追加一段代码如:这个是wps生成的xml模板,office也是同样。解决问题思路:既然和生成word的没啥关系,和浏览器下载的时候有关系。那就对该文件进行压缩,在下载,说干就干。利用java提供的压缩方法...

Joe192的博客 1692

freemarker实现导出word docx格式

实现方法: 解析docx文件并填充word/document.xml文件(不兼容word2003) 使用freemarker填充 doc(doc另存为xml格式的文件)(手机端打不开) 使用poi方式构建文档(极其繁琐,不灵活) 方法2 docx压缩包格式: 目录结构定义自行搜索 word目录 目录结构: inspectReport.docx提供基本的压缩包格式,文档内容为编辑后的模板(为减少大小可清空word/document.xml的内容,media等资源文件保留) inspectReport.

qq_38022877的博客 3507

导出word文档生成docx格式,包含freemarker遍历多张图片

为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便。 <!-- https://mvnrepository.com/artifact/freemarker/freemarker --> <dependency> <groupId>freemarker</groupId> <ar...

RyanJJ_的博客 2232

word导出图解,java使用freemarker生成word

注:需要返回流至前端的,只需要将流接收至HttpServletResponse即可,目前demo示例为导出到本电脑的临时目录中。注释:工具类有提供单个word文件导出,也提供多个文件压缩包导出。

qq_46038363的博客 434

springboot基础(78):Freemarker模板生成word文档

利用Freemarker模板生成word文档。示例,将左侧的模板生成为右侧的文档并下载。

不积跬步,无以至千里 3429
上一篇: springboot开发环境下搭建ftp+nginx图片服务器以及其他文件的存储
Return_KB
博客等级 码龄9年 23粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值