freemarker根据模板生成word文件实现导出功能
一、准备工作
1.创建一个03的word文档,动态的数据用占位符标志占位(如testname)。然后另存为word2003的xml文件。
2.格式化xml文件,占位符的位置用${testname}代替,若有多行格式相同数据等,用List循环。
注意事项:
1.不要用Eclipse工具去格式化xml文件(会导致导出的word文件不能用office软件打开,但是PDF能打开,估计是pdf的容错率高于office),推荐使用firstObject工具格式化xml文件。
2.xml中进行替换的时候:
变量替换时保证变量中没有多余的其他符号,如:<w:t>姓名:${realname}</w:t>
list中的数据变量替换规则: a.内容行之前添加:<#list listInfo as list>
b.内容行内容修改为:<w:t>${list.add}</w:t>
c.内容行之后添加:</#list>
firstobject下载地址:http://www.firstobject.com/dn_editor.htm -----按F8进行格式化
3.将xml文件(也可以改成ftl格式)存放到项目中指定位置。
3.下载freemarker的jar包(到中央仓库即可下载)。
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.</version>
</dependency>
二、前端
前端页面添加一个导出按钮,然后按钮添加点击事件,事件中跳转到所请求的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 351094262@qq.com
* @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层
@RequestMapping("/exportSellPlan")
@ResponseBody
public void exportSellPlan(HttpServletResponse response,PageUtils page, NcPartydeclare partydeclare) {
try {
Map<String, Object> dataMap = partyDeclareService.exportWordFile(response,page, partydeclare);
WordUtils.exportMillCertificateWord(response, dataMap, "D:/doc_f/","test.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
3.Server层(主要是获取数据源)
/**
* word文件导出
*/
@Override
public Map<String, Object> exportWordFile(HttpServletResponse response, PageUtils page, NcPartydeclare partydeclare) {
partydeclare.setUserid( getCurrUser().getUserid());
//数据源
List<?> list = partydeclareMapper.selectPersonPage(page, page.getOrderByClause(), partydeclare);
/** 用于组装word页面需要的数据 */
Map<String, Object> dataMap = new HashMap<String, Object>();
/** 组装数据 */
dataMap.put("realname", partydeclare.getRealname());
dataMap.put("zname", "");
dataMap.put("sname", "");
List<Map<String, Object>> listInfo = new ArrayList<Map<String, Object>>();
BigDecimal num = new BigDecimal ("0");
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<String, Object>();
if(list.size() -1 < i) {
map.put("index","");
map.put("sbtitle","");
map.put("add", "");
map.put("reduce","");
}else {
NcPartydeclare entity = (NcPartydeclare)list.get(i);
map.put("index",i+1);
map.put("sbtitle",entity.getTitle());
map.put("add", entity.getBonusvalue());
map.put("reduce", entity.getSubtractionvalue());
//计算总共
num = num.add(entity.getBonusvalue()).subtract(entity.getSubtractionvalue());
}
listInfo.add(map);
}
//计算总共分数
dataMap.put("total", num);
dataMap.put("listInfo", listInfo);
return dataMap;
}
三、最终结果

四、个人总结
此方法还是很简单,但是由于第一次使用,废了不少功夫。导出过程中会生成一个临时的文件,然后利用response的输出流将文件读取到浏览器客户端,读取完成后将会删除生成的临时文件。个人踩坑的地方是用Eclipse格式化了xml文件,导致了导出的word文件不能用office工具打开。
提示:此方法也可以进行excel文件的导出(导出excel时要注意设置excel的行号和列号,若是动态的行数或列数,可像如下进行配置:)。
<Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="${listInfo?size*2 + 10}" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"
freemarker根据模板生成word文件实现导出功能的更多相关文章
- 利用html模板生成Word文件(服务器端不需要安装Word)
利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...
- Java根据Freemarker模板生成Word文件
1. 准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...
- 根据指定Word模板生成Word文件
最近业务需要批量打印准考证信息 1.根据Table数据进行循环替换,每次替换的时候只替换Word中第一个Table的数据, 2.每次替换之后将Word中第一个Table数据进行复制,将复制Table和 ...
- Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...
- 使用word模板生成pdf文件
使用word模板生成pdf文件 源码:UserWord
- springMVC(4)---生成excel文件并导出
springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...
- 根据PDF模板生成PDF文件(基于iTextSharp)
根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...
- Java使用iText生成word文件的完美解决方案(亲测可行)
JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...
- java通过word模板生成word文档
介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...
随机推荐
- SQL Server 锁实验(UPDATE加锁探究)
update语句: 本例中由于看到的是update执行完的锁情况,因此无法看到IU锁,但其实针对要修改的数据页和索引页会先加IU锁,记录和键先加U锁,然后再转化为IX和X锁. 如果想要看到IU锁和U锁 ...
- MySQL高性能优化实战总结!
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
- C# 枚举转列表
using System; using System.Collections.Generic; using System.ComponentModel; namespace Common.Utils ...
- Linux 小知识翻译 - 「编译器和解释器」
这次聊聊「编译器和解释器」. 编程语言中,有以C为代表的编译型语言和以Perl为代表的解释型语言.不管是哪种,程序都是以人类能够理解的形式记录的,这种形式计算机是无法理解的. 因此,才会有编译器和解释 ...
- Java高级教程
目录 1.Java面向对象方法 1.1. 创建类和对象的方法 1.2. this的使用 1.3. 静态域和静态方法 1.3.1. 静态域:属于类的级别 1.3.2.静态常量 1.3.3 静态方法 1. ...
- ACE侧边栏刷新自动展开之前的选择
在body下面加上 <script type="text/javascript"> $(document).ready(function(){ var url = do ...
- syslog的坑
先看看代码: g_log, err := syslog.NewLogger(syslog.LOG_INFO, ) 再看看syslog的源码: // NewLogger creates a log.Lo ...
- PostgreSQL 数据库NULL值的默认排序行为与查询、索引定义规范 - nulls first\last, asc\desc
背景 在数据库中NULL值是指UNKNOWN的值,不存储任何值,在排序时,它排在有值的行前面还是后面通过语法来指定. 例如 -- 表示null排在有值行的前面 select * from tbl or ...
- (转)Geoserver基础配图研究
https://blog.csdn.net/zbcx_ZGIS/article/details/82216151 1面图层配图 1.1基本框架 这个是geoserver默认的polygon的代码,我们 ...
- 使用IntelliJ IDEA和Maven管理搭建Web开发环境(以Spring MVC为例)(二)
前言:在使用IntelliJ IDEA和Maven管理搭建Web开发环境(以Spring MVC为例)(一)中已经介绍了如何对web基础环境进行搭建,这里主要演示,如何对spring环境进行搭建,然后 ...