使用freemarker模板生成html文件(二)
导言
在上一篇的博客中,笔者向读者介绍了如何将Json转对象,及如何将对象转Json。那么,在本次的博客中,笔者将要向读者介绍的是,如何将一个Map作为资源,然后生成一份HTML的文件。这里需要读者自己先预备好一份freemarker的模板,模板的后缀是ftl。如果读者对于freemarker比较陌生的话,自己百度查找一个,它的语法其实是很简单的。读者也可能通过笔者给的模板来学习freemarker。很容易,一下子就会的。只要准备好模板和数据源,那么通过freemarker的方法就可以很快生成html、word、excel的文件。
freemarker的模板
前面笔者说了,我们需要准备模板。所以这里笔者给出了如下的模板,全名为html2.ftl,这个模板的${}就是表示需要代码填充的值,而${xxx.aaa}其中xxx就是表示某个对象的值。如果有循环遍历的话,那么用<#list ></#list>的标签,如果有判断条件,则用<#if></#if>。关于其它的语法,读者可以自己查找。
<html><head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 12 (filtered)">
<meta name=Originator content="Microsoft Word 12 (filtered)"></head><body lang=ZH-CN style='text-justify-trim:punctuation'>
<style>*{margin:0;padding:0;}.MsoNormalTable{margin:0 1%;width:98%;}.MsoNormalTable-toolbar{position: fixed;right:10px;z-index: 2;}.MsoNormalTable-toolbar input{min-width: 24px;line-height: 20px;cursor: pointer;color: #444;background: #fafafa;background-repeat: repeat-x;border: 1px solid #bbb;background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%);background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%);background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%);background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0);-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;/*对于特殊符号无影响*/padding:0 2px;}body{min-width: 988px;font-family: "微软雅黑";}@media (min-width: 998px) {.MsoNormalTable-toolbar{right: 50px;margin-right: 50px;margin-top:3px;}}
</style><table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0style='border-collapse:collapse;border:none'><tr><td width=100% colspan=13 valign=top style='border:solid #BFBFBF 1.0pt;background:#4f81bd;padding:0cm 5.4pt 0cm 5.4pt'><h3 class="text-center">学校【${schoolName}】,学院【${className}】的人员信息</h3></td></tr><tr><td width=100% colspan=13 valign=top style='border:solid #BFBFBF 1.0pt;border-top:none;background:#8064a2;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:11pt;color:white'>姓名</span></p></td></tr><tr><td width=25% colspan=3 valign=top style='border:solid #BFBFBF 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:9.0pt;color:#404040'>姓名</span></p></td><td width=18.6% colspan=3 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:9.0pt;color:#404040'>别名</span></p></td><td width=18.5% colspan=2 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;color:#404040'>年龄</span></p></td><td width=18.6% colspan=3 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span style='font-size:9.0pt;color:#404040'>地址</span></p></td></tr><#list student as user><tr><td width=25% colspan=3 valign=top style='border:solid #BFBFBF 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span lang=EN-US style='font-size:6.5pt;color:#888888'>${user.username}</span></p></td><td width=18.6% colspan=3 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span lang=EN-US style='font-size:6.5pt;color:#888888'>${user.secondName}</span></p></td><td width=18.5% colspan=2 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span lang=EN-US style='font-size:6.5pt;color:#888888'>${user.age}</span></p></td><td width=18.6% colspan=3 valign=top style='border-top:none;border-left:none;border-bottom:solid #BFBFBF 1.0pt;border-right:solid #BFBFBF 1.0pt;padding:0cm 5.4pt 0cm 5.4pt'><p class=MsoNormal><span lang=EN-US style='font-size:6.5pt;color:#888888'>${user.address}</span></p></td></tr></#list></body></html>
生成HTML/WORD/EXCEL文件
其实freemarker不仅仅生成HTML文件,还可以生成其它的文件,如word、excel的文件。这里笔者主要是介绍生成html的文件,其它两个文件只要改一下生成文件的后缀名就行了。如,生成html的文件,则是xxx.html;生成word文件,则xxx.doc;生成excel文件,则xxx.xls。
/*** 通过JSON生成Html,Excel,Word* @param data 数据源* @param fileName 文件名* @param templateFilePath 文件路径* @param templateFile 模板*/public static void createDayReportFiles(Map<String,Object> data,String fileName,String templateFilePath,String templateFile) {BufferedInputStream in = null;Writer out = null; Template template = null;try {//构造ConfigurationConfiguration configuration = new Configuration();configuration.setDefaultEncoding("utf-8"); configuration.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);configuration.setDirectoryForTemplateLoading(new File(templateFilePath));try { //test.ftl为要装载的模板 template = configuration.getTemplate(templateFile); } catch (IOException e) { e.printStackTrace(); } //输出文档路径及名称 File outFile = new File(fileName); FileOutputStream fos = null; try { fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8"); //这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。 out = new BufferedWriter(oWriter); } catch (FileNotFoundException e1) { e1.printStackTrace(); } //生成HTMLtemplate.process(data, out);} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TemplateException e) {e.printStackTrace();} finally {if(null != in) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if(null != out) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}
测试方法
笔者写了如下的方法来测试上面的代码。执行下面的代码将会生成result.html.
public static void main(String[] args) {Map<String,Object> classMap = new HashMap<String, Object>();classMap.put("schoolName", "NYU");classMap.put("className", "计算机科学与技术");List<Map<String,String>> stuList = new ArrayList<Map<String,String>>();// Map<String,Map<String,String>> stuMap = new HashMap<String,Map<String,String>>();Map<String,String> students1 = new HashMap<String, String>();students1.put("username", "tom");students1.put("secondName", "joy");students1.put("age", "29");students1.put("address", "北京");Map<String,String> students2 = new HashMap<String, String>();students2.put("username", "Jim");students2.put("secondName", "william");students2.put("age", "22");students2.put("address", "上海");Map<String,String> students3 = new HashMap<String, String>();students3.put("username", "Jerry");students3.put("secondName", "Nick");students3.put("age", "25");students3.put("address", "深圳");stuList.add(students1);stuList.add(students2);stuList.add(students3);classMap.put("student", stuList);createDayReportFiles(classMap,"F:/ftl/result.html","F:/ftl/","html2.ftl");}
总结
以上就是笔者向读者们介绍的用freemarker来生成html文件。同时也给出了相应的代码。执行测试代码结果如下:
使用freemarker模板生成html文件(二)相关推荐
- freemarker 模板生成pdf文件并下载
利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...
- freemarker模板生成pdf文件
文章目录 1.pom依赖 2.ftl模板以及宋体文件 2.1.文件路径 2.2.ftl文件模板(test.ftl) 3.controller生成pdf文件 1.pom依赖 <!--freemar ...
- freemarker 生成java_半自动化Java代码生成器[利用freemarker模板生成]
rapid-generator 半自动化Java代码生成器[利用freemarker模板生成] 增加一些定制和扩展, 修改为基于MAVEN的格式. 整体架构保持不变. 增加的特性为: 支持表名前缀去除 ...
- Freemarker模板生成排版缩进问题
在将Freemarker作为模板使用时,生成的目标文件(HTML或xml或其他类型文件)时,往往会出现排版错乱的问题. 主要是:明明没有那么多占位符或缩进,但生成出来的文件却有对应的缩进. 类似下图效 ...
- springboot结合Freemarker模板生成docx格式的word文档(附代码)
首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...
- JavaWeb(14) 页面静态化之使用freemarker模板生成一个html静态页面
题外话: 页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术 从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言( ...
- java生成docx_java利用Freemarker模板生成docx格式的word文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...
- itextpdf通过pdf模板生成pdf文件
itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...
- java 根据word模板生成word文件
Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...
- java利用Freemarker模板生成格式友好的doc或者docx文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...
最新文章
- 大家一起来《六顶思考帽》
- 上接[翻译]ASP.NET 2.0中的健康监测系统(Health Monitoring)(1) - 基本应用
- 如何制作Vuejs组件,并且在项目中使用
- c++如何防止一个类被其他类继承?
- Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
- flume流程之http-memory-hdfs
- de4dot 反编译
- MATLAB(五) 图像处理--图像分割
- 局域网 如何连接主机_局域网远程操控电脑方法
- android checkbox分页问题分析
- java九宫格案例讲解_Java实现九宫格的教程详解
- 微信小程序自定义省市县联动组件
- 2021-11-03 投资学实务翻译9.1和9.2
- 客户端与服务器交互的功能,如何进行测试?
- 原生前端实现响应式个人简历网站设计(附源码)
- c语言把结构体首地址放入指针,C语言基础———指针,结构体指针,函数指针
- 应用层协议 HTTP HTTPS
- 【Python】常用小代码
- A系列RPG地图编辑器发布,终于可以编辑地图了
- java urlrewrite post_UrlRewrite 简介与示例