freemarker根据模板生成word文件实现导出功能

一、准备工作

1.创建一个03的word文档,动态的数据用占位符标志占位(如testname)。然后另存为word2003的xml文件。

2.格式化xml文件,占位符的位置用${testname}代替,若有多行格式相同数据等,用List循环。

  注意:不要用Eclipse工具去格式化xml文件(会导致导出的word文件不能用office软件打开,但是PDF能打开,估计是pdf的容错率高于office),推荐使用firstObject工具格式化xml文件。

3.将xml文件(也可以改成ftl格式)存放到项目中指定位置。

3.下载freemarker的jar包。

    

二、前端

前端页面添加一个导出按钮,然后按钮添加点击事件,事件中跳转到所请求的Controller层即可:

window.location.href=‘XXXController/XXXMethod‘;

如有参数,直接添加到后边即可。

三、后台

1.编写工具类

  

package io.renren.common.utils;

import java.io.BufferedWriter;
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.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
* 文件导出工具类
*
* @author zblwj
* @email [email protected]
* @date 2018年11月1日下午2:40:42
*/
public class WordUtils {
/**
* 生成word文档
*/
@SuppressWarnings("unchecked")
public static File createWord(Map dataMap,String templateName,String filePath,String fileName){

try {
//创建配置实例
Configuration configuration = new Configuration();

//设置编码
configuration.setDefaultEncoding("UTF-8");

//ftl模板文件
configuration.setClassForTemplateLoading(WordUtils.class,"/template");

//获取模板
Template template = configuration.getTemplate(templateName);

//输出文件
File outFile = new File(filePath+File.separator+fileName);
//如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
}
//将模板和数据模型合并生成文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
//生成文件
template.process(dataMap, out);
//关闭流
out.flush();
out.close();
return outFile;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* 生成文件名字
* @return
*/
public static String creatFileName() {
/** 文件名称,唯一字符串 */
Random r = new Random();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
StringBuffer sb = new StringBuffer();
sb.append(sdf1.format(new Date()));
sb.append("_");
sb.append(r.nextInt(100));
//文件唯一名称
String fileOnlyName = "机关党支部党员积分申报表" + sb + ".doc";
return fileOnlyName;
}

/**
* 导出文件
* @throws IOException
*/
public static void exportMillCertificateWord( HttpServletResponse response, Map map,String filePath,String templateName) throws IOException {
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
String fileName = WordUtils.creatFileName();
file = WordUtils.createWord(map, templateName, filePath,fileName);
fin = new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
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.close();
if(file != null) file.delete(); // 删除临时文件
}

}
}

2.Controller层

3.Server层

三、最终结果

四、个人总结

此方法还是很简单,但是由于第一次使用,废了不少功夫。导出过程中会生成一个临时的文件,然后利用response的输出流将文件读取到浏览器客户端,读取完成后将会删除生成的临时文件。个人踩坑的地方是用Eclipse格式化了xml文件,导致了导出的word文件不能用office工具打开。

原文地址:https://www.cnblogs.com/zblwyj/p/9907913.html

时间: 2024-10-26 03:43:39

freemarker根据模板生成word文件实现导出功能的相关文章

利用html模板生成Word文件(服务器端不需要安装Word)

利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端的方法来实现,经过测试这种方法也是一种不错的选择! 首先自己写一个html网页模板,代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>

java根据模板生成word文件

原文:java根据模板生成word文件 源代码下载地址:http://www.zuidaima.com/share/1550463664884736.htm AVA生成word模板程序步骤 1. 将freemarker-2.3.13.jar复制到项目\WEB-INF\lib目录下 2. 编辑模板文件 (1) 将DOC文件另存为xml文件,将xml文件在eclipse环境下打开,右键选"源"→"格式".此处注意xml文件属性是UTF-8. (2) 将xml文件中需要替

Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

Java项目引入 Freemarker 插件自行完成. 步骤如下: 1.编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: 2.把该 word 文档 另存为 xml 文件(格式选择 Word 2003 XML,注意是另存为,不是改扩展名为 xml),然后再改扩展名为 ftl: 3.用编辑软件打开最后的 ftl 文件,并用查找功能查找第一步中定义的变量名,如:username, 就会发现 Word 软件在将 Word

使用word的xml模板生成.doc文件

一.编辑模板 替换地方以变量标记如"案件编号"可写成{caseNo} template.xml 二.准备数据 以HashMap封装数据,原理是替换模板中的变量 三.替换操作 选择输出位置:writePath WordUtil.printWordbyXMLWithOutputPath(templateFile, writePath, filename, dataMap); /** * 打印word文档(传入参数需要传入输出文件的保存路径的) * @param templateFile *

使用模板生成word文档

使用poi-tl根据模板生成word文档,在porm.xml中添加poi-tl依赖,直接上代码 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.render.RenderAPI; import com.thinkge

java通过word模板生成word文档

介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱于是采用这个,正常生成成功了还挺高兴的于是修改优化部署测试,出问题了,由于我一直使用wps可以正常打开,但是同事使用office打不开,于是各种查找原因都没好,于是只能转变思路又试了两种还是不好用,直到发现这款模板生成 poi-tl 真的做的很不错,而且是国人写的,关于学习这个东西还是看官方文档的好

JSP生成word文件

1.jsp生成word文件,直接修改jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"%> <%@ pagepageEncoding="GB2312"%> <% String fileName ="word.doc"; byte[] bt =fileName.getBytes("GB2312"); String

根据html生成Word文件,包含图片

根据html内容生成word,并自动下载下来.使用到了itext-1.4.6.jar import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; import java.net.URLEncoder; import

Laravel Excel 实现 Excel-CSV 文件导入导出功能

Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https://github.com/Maatwebsite/Laravel-Excel 安装 我们就按照GIthub上的readme文件进行安装吧. composer require "maatwebsite/excel:~2.1.0" 在 config/app.php 中注册服务提供者到 provid