最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多。由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求。这里介绍种采用FreeMarker的api来生成Excel文件的方案

一、方案的对比

        针对这个需求我想了2个方案,介绍如下
                方案一:先做一个合同的表格模板,然后把变量都填充成类似EL表达式的样子。然后通过poi 相关类把模板读到内存中,把里面的变量的值替换,然后生成下载文件。
                方案二:先做一个合同的表格模板,然后转换成xml文件,然后再改成FreeMarker的ftl文件。通过FreeMarker的Api 把往模板上填充数据,然后生成下载文件。

        简单分析下上面的2个方案:
        方案一比较适合那种模板中的行数不会变的场景,如果合同的头和尾是固定的,中间的行数不固定,那么就方案就不适合了。
        方案二比方案一更灵活,由于FreeMarker的模板文件中可以使用很多标签,如(<#List></#List>);应付这种中间行数不固定的场景就是小case了。
    所以,这种导出的Excel有格式要求的,采用FreeMarker生成Excel是最好实现的。

二、介绍下FreeMarker方案实现过程

     (1)把Excel模板的格式调好,另存为xml文件
     (2)制作一个ftl模板,把xml文件内容copy进去,把变量换成FreeMarker的插值
     (3)针对一些动态的行和列,采用FreeMarker的标签来实现
     (4)代码中的处理,主要是调用FreeMarker的标签,把模板和数据一结合,就生成了文件了

        下面附上一段后台的java代码
   public void exportExcel(){
try {
/** 1.从数据库查出数据 */
List<User> uList = userService.findAll(); /** 2.封装数据 */
Map<String, Object> dataMap = new HashMap<String, Object>();
List<Map<String, String>> userList = new ArrayList<>(uList.size());
for (User u : uList) {
Map<String, String> rowData = new HashMap<>();
rowData.put("name", u.getName());
rowData.put("account", u.getAccount());
rowData.put("dept", u.getDept());
rowData.put("gender", u.isGender() ? "男" : "女");
rowData.put("email", u.getEmail());
userList.add(rowData);
}
dataMap.put("userList", userList); /** 3.调用FreeMarker的Api生成Excel */
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
// 设置加载模板文件的位置
cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(), "/ftl");
// 获取模板
Template template = cfg.getTemplate("exportExcel.ftl");
// 设置response的header
HttpServletResponse response = ServletActionContext.getResponse();
// 防止乱码,设置下编码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename=testExcel.xls");
// 生成Excel
template.process(dataMap, response.getWriter());
} catch (Exception e) {
e.printStackTrace();
}
}
 
1
   public void exportExcel(){
2
        try { 
3
            /** 1.从数据库查出数据 */
4
            List<User> uList = userService.findAll();
5
            
6
            /** 2.封装数据 */
7
            Map<String, Object> dataMap = new HashMap<String, Object>();
8
            List<Map<String, String>> userList = new ArrayList<>(uList.size());
9
            for (User u : uList) {
10
                Map<String, String> rowData = new HashMap<>();
11
                rowData.put("name", u.getName());
12
                rowData.put("account", u.getAccount());
13
                rowData.put("dept", u.getDept());
14
                rowData.put("gender", u.isGender() ? "男" : "女");
15
                rowData.put("email", u.getEmail());
16
                userList.add(rowData);
17
            }
18
            dataMap.put("userList", userList);
19
            
20
            /** 3.调用FreeMarker的Api生成Excel */
21
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
22
            // 设置加载模板文件的位置
23
            cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(), "/ftl");
24
            // 获取模板
25
            Template template = cfg.getTemplate("exportExcel.ftl");
26
            // 设置response的header 
27
            HttpServletResponse response = ServletActionContext.getResponse();
28
            // 防止乱码,设置下编码
29
            response.setCharacterEncoding("utf-8");
30
            response.setHeader("Content-Disposition", "attachment; filename=testExcel.xls");
31
            // 生成Excel
32
            template.process(dataMap, response.getWriter());
33
        } catch (Exception e) {
34
            e.printStackTrace();
35
        }
36
    } 

                

JavaWeb开发中采用FreeMarker生成Excel表格的更多相关文章

  1. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  2. Java操作Jxl实现导出数据生成Excel表格数据文件

    实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...

  3. Javaweb开发中URL路径的使用

    看到博客园孤傲苍狼的web系列文章中有关于URL路径的使用文章后,感觉自己对URL的使用清楚了很多,自己再对着动手写一遍以加深记忆. JavaWeb开发中常看到URL以"/"开头, ...

  4. H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: <!DOCTYPE html> <html> <head> <title></title> < ...

  5. 详解python操作生成excel表格,并且填充数据

    最近在研究python操作excel表格的问题,首先读取excel表格觉得平时用的多,不怎么有难度,就是pyhon生成excel表格的时候,平时不怎么用,所以重点研究了一下,现总结如下: 1.首先用到 ...

  6. 使用Aspose插件将程序中的表格,导出生成excel表格

    http://www.cnblogs.com/lanyue52011/p/3372452.html这个是原文地址 /// <summary> /// 点击按钮,将内存表导出excel表格! ...

  7. 在.NET中使用EPPlus生成Excel报表 .

    --摘抄自:http://blog.csdn.net/zhoufoxcn/article/details/14112473 在开发.NET应用中可能会遇到需要生成带图表(Chart)的Excel报表的 ...

  8. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  9. 数据库数据生成Excel表格(多用在导出数据)

    最近在项目开发中遇到这样一个需求,用户聊天模块产品要求记录用户聊天信息,但只保存当天的,每天都要刷新清空数据,但聊天记录要以Excel的形式打印出来,于是就引出了将数据库的数据导出成Excel表格的需 ...

随机推荐

  1. iOS动画-从UIView到Core Animation

    首先,介绍一下UIView相关的动画. UIView普通动画: [UIView beginAnimations: context:]; [UIView commitAnimations]; 动画属性设 ...

  2. 对word2vec的理解及资料整理

    对word2vec的理解及资料整理 无他,在网上看到好多对word2vec的介绍,当然也有写的比较认真的,但是自己学习过程中还是看了好多才明白,这里按照自己整理梳理一下资料,形成提纲以便学习. 介绍较 ...

  3. 常用的Git命令整理

    之前一直忙于项目苦于没有时间总结,今天刚好有时间特来总结一下在工作中常用到的代码版本管理器Git.至于为什么要用Git?Git相比SVN有哪些好处?我就不多说了,前人已经总结的很好.今天主要介绍的是常 ...

  4. OneAPM大讲堂 | Java 异常日志记录最佳实践

    [编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译 ...

  5. Python使用map,reduce高阶函数模拟实现Spark的reduceByKey算子功能

    # 使用默认的高阶函数map和reduce import randomdef map_function(arg):  # 生成测试数据 return (arg,1) list_map = list(m ...

  6. 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

    经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...

  7. HDU ACM 1856 More is better(并查集)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1856 [解题思路]给的数据有点大,干脆少开点数组,直接上set存储有朋友的孩子的编号,同时根据编号初 ...

  8. fedora更新

    先换源再更新,否则等的太久,如果已经开始了直接ctrl+c取消 # dnf update

  9. 遇到电脑IP地址冲突了怎么解决

    由于路由器是自动分配IP地址的,如果多个设备设置的是IP地址自动获取,就会出现IP地址冲突的情况当局域网内有相同IP,并且该机器启动了防火墙,那就没办法自动更新到下一个IP的地址了,所以此时发生了冲突 ...

  10. February 1st, 2018 Week 5th Thursday

    The world is a fine place, and worth fighting for. 这世界是个好地方,值得为之奋斗. The world is beautiful, there ar ...