导言

在上一篇的博客中,笔者向读者介绍了如何将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文件(二)相关推荐

  1. freemarker 模板生成pdf文件并下载

    利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...

  2. freemarker模板生成pdf文件

    文章目录 1.pom依赖 2.ftl模板以及宋体文件 2.1.文件路径 2.2.ftl文件模板(test.ftl) 3.controller生成pdf文件 1.pom依赖 <!--freemar ...

  3. freemarker 生成java_半自动化Java代码生成器[利用freemarker模板生成]

    rapid-generator 半自动化Java代码生成器[利用freemarker模板生成] 增加一些定制和扩展, 修改为基于MAVEN的格式. 整体架构保持不变. 增加的特性为: 支持表名前缀去除 ...

  4. Freemarker模板生成排版缩进问题

    在将Freemarker作为模板使用时,生成的目标文件(HTML或xml或其他类型文件)时,往往会出现排版错乱的问题. 主要是:明明没有那么多占位符或缩进,但生成出来的文件却有对应的缩进. 类似下图效 ...

  5. springboot结合Freemarker模板生成docx格式的word文档(附代码)

    首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...

  6. JavaWeb(14) 页面静态化之使用freemarker模板生成一个html静态页面

    题外话:        页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言( ...

  7. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  8. itextpdf通过pdf模板生成pdf文件

    itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...

  9. java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...

  10. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

最新文章

  1. 大家一起来《六顶思考帽》
  2. 上接[翻译]ASP.NET 2.0中的健康监测系统(Health Monitoring)(1) - 基本应用
  3. 如何制作Vuejs组件,并且在项目中使用
  4. c++如何防止一个类被其他类继承?
  5. Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
  6. flume流程之http-memory-hdfs
  7. de4dot 反编译
  8. MATLAB(五) 图像处理--图像分割
  9. 局域网 如何连接主机_局域网远程操控电脑方法
  10. android checkbox分页问题分析
  11. java九宫格案例讲解_Java实现九宫格的教程详解
  12. 微信小程序自定义省市县联动组件
  13. 2021-11-03 投资学实务翻译9.1和9.2
  14. 客户端与服务器交互的功能,如何进行测试?
  15. 原生前端实现响应式个人简历网站设计(附源码)
  16. c语言把结构体首地址放入指针,C语言基础———指针,结构体指针,函数指针
  17. 应用层协议 HTTP HTTPS
  18. 【Python】常用小代码
  19. A系列RPG地图编辑器发布,终于可以编辑地图了
  20. java urlrewrite post_UrlRewrite 简介与示例

热门文章

  1. JavaScript BOM基础
  2. numpy中的broadcast
  3. HTML 5 新标签
  4. 携程第二场预赛 1003:位图像素的颜色(水题,判断点是否在矩形内)
  5. MOSS自带SPDatePickerControl控件的使用
  6. 在Ubuntu上面使用华为EC3372
  7. web安全day42:使用BurpSuite理解Web工作机制
  8. 区块链教程Fabric1.0源代码分析配置交易-生成通道配置
  9. 阿里云服务器ECS云盾提醒网站被WebShell木马后门分析与对策
  10. Android应用开发以及设计思想深度剖析(2)