JavaWeb开发中采用FreeMarker生成Excel表格

左心房为你撑大大i 提交于 2020-04-30 19:54:37
         最近做了一个需求,要求导出一个采购合同的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
    } 

                
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!