这是我第一次写博客。主要是想总结一下自己学习的知识!不足之处望大家指正!谢谢
FreeMarker 是一个模版引擎,一个基于文本的模板输出工具(生成任意的HTML表单代码)。它是一个Java package,面向Java程序员的class library。它本身并不是针对最终用户的应用,而是允许程序员将其嵌入到他们的产品中。
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC(Model View Controller)模式的应用程序。使用 MVC 模式作为动态的WEB页面的想法,是为了分隔页面设计者 (HTML 设计者) 和程序员。.每个人做自己擅长的那一部分。设计者可以不通过程序员的改变或修改代码来改变网页的样子,因为应用逻辑(Java程序)和页面设计(FreeMarker 模版)是分开的。模板不会被复杂繁琐的程序框架所破坏。即使当一个项目的程序员和HIMTL页面的制作者是同一个人时,这种分隔也是很有用,因为这样有助于保持应用的清晰并易于维护。
当项目当有大量doc,xls文档生成的时候,我们很多时候都是用开源jar包自己去写这些文档,表格。例如jxl.*这些jar包去写这些格式,动态插入数据。可是当表格比较多,格式比较复杂,API不是很熟的时候,写这些表格会花费很多时间。
我在项目中,发现了一个新方法,开始将doc文档另存为xml格式,可是xml格式总的空格在导出的时候无法取出。最后我将doc或者xls文件另存为mhtml格式。用FreeMarker解析mhtl格式文件,然后再用流写出。
一下提供部分源码:
1.导入jar包
2.首先src下面配置freemaker.properties文件,配置内容如下
template_update_delay=1
datetime_format=yyyy-MM-dd HH:mm:ss#配置datetime_format时间格式
date_format=yyyy-MM-dd#配置date_format时间格式
time_format=HH:mm:ss#配置time_format格式
number_format=0.##;#配置数字格式化格式
boolean_format=true,false#Boolean值类型可自己设置
auto_import="/WEB-INF/ftl_lib/common/index.ftl" as p#模板标签
whitespace_stripping=true#
#default_encoding=GBK#模板解析编码
tag_syntax=auto_detect
url_escaping_charset=UTF-8
#struts.freemarker.templatesCache=true
#template_update_delay=60000
3.解析方法如下
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
//freemaker生成器
public class FreemarkerGenerator {
Configuration cfg = null;
public FreemarkerGenerator(String templatePath) throws IOException {
cfg = new Configuration();//初始化freemaker配置,创建一个Configuration对象
cfg.setDefaultEncoding("UTF-8");//设置编码
cfg.setDirectoryForTemplateLoading(new File(templatePath));//设置freemaker模板位置
cfg.setObjectWrapper(new DefaultObjectWrapper());
}
/**
* 生成静态文件
*
* @param ftlTemplate
* ftl模版文件
* @param contents
* ftl要用到的动态内容
* @param savePath
* 文件保存路径
* @param saveFilename
* 保存文件名
* @throws IOException
* @throws TemplateException
*/
public void create(String ftlTemplate, Map contents, String savePath,
String saveFilename) throws IOException, TemplateException {
Template temp = cfg.getTemplate(ftlTemplate);//取得模板文件
/* Merge data model with template */
String realPath = ServletActionContext.getServletContext().getRealPath(
savePath);
File file = new File(realPath);
if (!file.exists())
file.mkdirs();
Writer out = new OutputStreamWriter(new FileOutputStream(realPath + "/"
+ saveFilename), "UTF-8");
temp.process(contents, out);//解析
out.flush();
}
/**
将模板文件解析成字符串
*/
public String parse(String ftlTemplate, Map contents) throws IOException,
TemplateException {
try {
Template temp = cfg.getTemplate(ftlTemplate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(baos);
temp.process(contents, out);
out.flush();
return baos.toString("utf-8");
}catch(Exception exception) {
exception.printStackTrace();
}
return "";
}
}
////////////////////////////////////////////////////////////////////
/**
*解析模板
*
* @param tempPath也就是你将doc,xls文档转换未mhtml的文件路径
* @param content模板里面需要的参数通过key-value的形式传入,在模板里面使用标签${value}填充表格需要最后显示的字段
* @return
*/
public String parseFtl(String tempPath, Map<object> content) {
FreemarkerGenerator fmGen;
String strSellCount = null;
try {
fmGen = new FreemarkerGenerator(contextHelper
.getAppRealPath("/WEB-INF/content/corpcenter/inc"));//如果不是web应用则可以不用的到真实路径
strSellCount = fmGen.parse(tempPath, content);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return strSellCount;
}
/**
*
* @param filePath//要生成德文件路径
* @param templatePath//mhtml文件路径
* @param fileName//生成的文件名
* @param exportType//生成的文件类型doc or xls
* @param content//mthl里面需要显示的内容 如:导出订单列表,你可以
Map content = new HashMap();
map.put("item",item);//在mhtml文件需要显示的地方${item.cartItems}即可
map.put("user",user);//要显示客户名称${user.userName}
此map可以put你页面想要的值或者对象。
* @return
*/
public File createFile(String filePath, String templatePath,
String fileName, String exportType, Map<object> content) {
String path = "";
if (exportType != null && exportType.equals(".doc")) {
path = filePath + fileName + ".doc";
} else {
path = filePath + fileName + ".xls";
}
File file = new File(path);
BufferedReader br = null;
BufferedWriter bw = null;
String strTemp = parseFtl(templatePath, content);
try {
br = new BufferedReader(new StringReader(strTemp));
bw = new BufferedWriter(new FileWriter(file));
char[] buf = new char[1024];
int len;
while ((len = br.read()) != -1) {
bw.write(buf, 0, len);
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
4.这样你就可以将事先编辑好的文档按照正确的格式导出。注意一点就是,编码问题。doc或者xls是微软公司的产品,里面的编码是charset="us-ascii"会出现乱码,记得改成charset="us-utf-8"这样mhtml模板是乱码,但是通过IO流读出是编码是正确的,此编码问题我一只没有找到解决的方法。
</object></object>
FreeMarker 是一个模版引擎,一个基于文本的模板输出工具(生成任意的HTML表单代码)。它是一个Java package,面向Java程序员的class library。它本身并不是针对最终用户的应用,而是允许程序员将其嵌入到他们的产品中。
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC(Model View Controller)模式的应用程序。使用 MVC 模式作为动态的WEB页面的想法,是为了分隔页面设计者 (HTML 设计者) 和程序员。.每个人做自己擅长的那一部分。设计者可以不通过程序员的改变或修改代码来改变网页的样子,因为应用逻辑(Java程序)和页面设计(FreeMarker 模版)是分开的。模板不会被复杂繁琐的程序框架所破坏。即使当一个项目的程序员和HIMTL页面的制作者是同一个人时,这种分隔也是很有用,因为这样有助于保持应用的清晰并易于维护。
当项目当有大量doc,xls文档生成的时候,我们很多时候都是用开源jar包自己去写这些文档,表格。例如jxl.*这些jar包去写这些格式,动态插入数据。可是当表格比较多,格式比较复杂,API不是很熟的时候,写这些表格会花费很多时间。
我在项目中,发现了一个新方法,开始将doc文档另存为xml格式,可是xml格式总的空格在导出的时候无法取出。最后我将doc或者xls文件另存为mhtml格式。用FreeMarker解析mhtl格式文件,然后再用流写出。
一下提供部分源码:
1.导入jar包
2.首先src下面配置freemaker.properties文件,配置内容如下
template_update_delay=1
datetime_format=yyyy-MM-dd HH:mm:ss#配置datetime_format时间格式
date_format=yyyy-MM-dd#配置date_format时间格式
time_format=HH:mm:ss#配置time_format格式
number_format=0.##;#配置数字格式化格式
boolean_format=true,false#Boolean值类型可自己设置
auto_import="/WEB-INF/ftl_lib/common/index.ftl" as p#模板标签
whitespace_stripping=true#
#default_encoding=GBK#模板解析编码
tag_syntax=auto_detect
url_escaping_charset=UTF-8
#struts.freemarker.templatesCache=true
#template_update_delay=60000
3.解析方法如下
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
//freemaker生成器
public class FreemarkerGenerator {
Configuration cfg = null;
public FreemarkerGenerator(String templatePath) throws IOException {
cfg = new Configuration();//初始化freemaker配置,创建一个Configuration对象
cfg.setDefaultEncoding("UTF-8");//设置编码
cfg.setDirectoryForTemplateLoading(new File(templatePath));//设置freemaker模板位置
cfg.setObjectWrapper(new DefaultObjectWrapper());
}
/**
* 生成静态文件
*
* @param ftlTemplate
* ftl模版文件
* @param contents
* ftl要用到的动态内容
* @param savePath
* 文件保存路径
* @param saveFilename
* 保存文件名
* @throws IOException
* @throws TemplateException
*/
public void create(String ftlTemplate, Map contents, String savePath,
String saveFilename) throws IOException, TemplateException {
Template temp = cfg.getTemplate(ftlTemplate);//取得模板文件
/* Merge data model with template */
String realPath = ServletActionContext.getServletContext().getRealPath(
savePath);
File file = new File(realPath);
if (!file.exists())
file.mkdirs();
Writer out = new OutputStreamWriter(new FileOutputStream(realPath + "/"
+ saveFilename), "UTF-8");
temp.process(contents, out);//解析
out.flush();
}
/**
将模板文件解析成字符串
*/
public String parse(String ftlTemplate, Map contents) throws IOException,
TemplateException {
try {
Template temp = cfg.getTemplate(ftlTemplate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(baos);
temp.process(contents, out);
out.flush();
return baos.toString("utf-8");
}catch(Exception exception) {
exception.printStackTrace();
}
return "";
}
}
////////////////////////////////////////////////////////////////////
/**
*解析模板
*
* @param tempPath也就是你将doc,xls文档转换未mhtml的文件路径
* @param content模板里面需要的参数通过key-value的形式传入,在模板里面使用标签${value}填充表格需要最后显示的字段
* @return
*/
public String parseFtl(String tempPath, Map<object> content) {
FreemarkerGenerator fmGen;
String strSellCount = null;
try {
fmGen = new FreemarkerGenerator(contextHelper
.getAppRealPath("/WEB-INF/content/corpcenter/inc"));//如果不是web应用则可以不用的到真实路径
strSellCount = fmGen.parse(tempPath, content);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return strSellCount;
}
/**
*
* @param filePath//要生成德文件路径
* @param templatePath//mhtml文件路径
* @param fileName//生成的文件名
* @param exportType//生成的文件类型doc or xls
* @param content//mthl里面需要显示的内容 如:导出订单列表,你可以
Map content = new HashMap();
map.put("item",item);//在mhtml文件需要显示的地方${item.cartItems}即可
map.put("user",user);//要显示客户名称${user.userName}
此map可以put你页面想要的值或者对象。
* @return
*/
public File createFile(String filePath, String templatePath,
String fileName, String exportType, Map<object> content) {
String path = "";
if (exportType != null && exportType.equals(".doc")) {
path = filePath + fileName + ".doc";
} else {
path = filePath + fileName + ".xls";
}
File file = new File(path);
BufferedReader br = null;
BufferedWriter bw = null;
String strTemp = parseFtl(templatePath, content);
try {
br = new BufferedReader(new StringReader(strTemp));
bw = new BufferedWriter(new FileWriter(file));
char[] buf = new char[1024];
int len;
while ((len = br.read()) != -1) {
bw.write(buf, 0, len);
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
4.这样你就可以将事先编辑好的文档按照正确的格式导出。注意一点就是,编码问题。doc或者xls是微软公司的产品,里面的编码是charset="us-ascii"会出现乱码,记得改成charset="us-utf-8"这样mhtml模板是乱码,但是通过IO流读出是编码是正确的,此编码问题我一只没有找到解决的方法。
</object></object>
发表评论
-
javascript常用函数search用法
2011-08-22 14:26 3953javascript常用函数总结 search 定义和用法 ... -
java变量初始化顺序
2011-08-04 15:28 16001.变量初始化顺序:静 ... -
Oracle数据库如何创建表空间
2011-08-04 11:40 12096oracle如何创建表空间和备份数据 1.创建数据表空间 ... -
java异常总结
2011-08-02 15:18 5911.No row with the given identif ... -
删除SVN历史用户密码记录
2011-03-31 14:05 1575C:\Documents and Settings\Admin ... -
Java数组的扩展
2010-11-20 10:00 5738package test; import java.lang ... -
常用链接
2010-08-31 22:26 0SVN: http://subclipse.tigris.or ... -
java模式
2010-08-17 22:43 0... -
oracle数据库权限总结
2010-08-16 21:59 1313今天我想就我最近学习oracle权限的笔记总结一下。 ... -
数据结构学习总结
2010-08-15 21:40 0最近我在学习数据结 ... -
hibernate list和iterate 的区别
2010-08-03 22:47 3384今天我想讲一下我前几天面试遇到的一个hibernate问 ... -
Effective java学习笔记
2010-08-01 17:26 10881.静态工厂方法代替构造函数 如:pub ...
相关推荐
使用 Freemarker 模板引擎创建一个简单的 Spring 工程。
FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...
FreeMarker使用Macro实例,很好的学习资料。
freemarker使用手册 尚学堂教材
FreeMarker使用介绍 FreeMarker使用介绍
Freemarker使用,比较全面,有需要的可以看看
freemarker使用笔记,从创建文件到写法指导
Reference(FreeMarker 的参考文档,语言使用介绍) 中文翻译之所以选择 Programmer's Guide 是因为个人觉得该部分对如何实现 FreeMarker 进行了比较深入的阐述。有助于读者很好的了解其运作机制,以及去理解...
在开发web项目的时候使用到的页面展现技术,它并...总体,该文档能够提供所有常用的freemarker操作,示例和简略的讲解可以让人一下子就能上手,效率极高。 适合做快速查阅册子,同时也非常适合初学者和骨灰开发者使用。
freemarker的常用技巧:Hashes(散列)操作 Sequences(序列) 内置函数
freemarker常用使用文档......................................................................
Freemarker使用指南简要描述开发过程中涉及的指令, 集成模式等
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所...
freemarker中文手册,加上了防止资源重复的字样,之前是别人分享来的但是需要积分,这个版的不用积分方便大家使用,主要用于分享,如侵权及时联系我删除,谢谢。
NULL 博文链接:https://chaoyi.iteye.com/blog/2171159
此文档是关于前端页面freemarker模板的使用说明,很适合freemarker初学者学习
freemarker操作手册-完整freemarker教程:完整的freemarker操作手册,对需要学习了解freemarker的人有一定帮助
采用freemarker技术、实现导出excel示例
FreeMarker设计指南.ppt
FreeMarker的入门以及使用指南,想要学习的同学,希望对你们有帮助。