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

最近做了一个需求,要求导出一个采购合同的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

    } 

原文地址:https://www.cnblogs.com/zeng1994/p/9295284.html

时间: 2024-10-26 23:03:38

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

【PHP】PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数)

[PHP]PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数) 前言 由于业务需要,我们需要从业务中汇总数据,并生成Excel文件. 思路是这样的 PHP要导出Excel表格文件->找一个好用的第三方库吧->在Composer的Packages里找一个吧->PHPExcel这么多收藏,就它了! PHPExcel 概述 PHPExcel is a library written in pure PHP and providing a set of classes th

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

--摘抄自:http://blog.csdn.net/zhoufoxcn/article/details/14112473 在开发.NET应用中可能会遇到需要生成带图表(Chart)的Excel报表的需求,特别是在一些ASP.NET网站中,有时候我们并不能保证Web服务器上一定安装了Office组件,所以使用微软的Office来生成Excel并不保证在所有情况下都使用,有时候即使Web服务器上安装了Office也会出现一些运行权限方面的原因到导致调用Excel组件生成Excel失败,所以在这里介

java生成excel表格和pdf并实现下载弹出框

今天在pdf和excel中都实现了在浏览器弹出下载框 将之前在网上查找的生成excel表格代码稍微修改下: public class CreateSimpleExcelToDisk { /** * @功能:手工构建一个简单格式的Excel */ private static List<News> getNews() throws Exception { List<News> data = new ArrayList<News>(); NewsDao dao = new

JavaWeb开发中form、ajax提交数据Model转化

JavaWeb开发中form.ajax提交数据Model转化 问题 最近学习MongoDB数据库,作为java开发的我,当然需要做个小的web程序来测试一番了.在html中我采取ajax提交方式,因为我要模拟各种类型的数据,基础数据类型.数组.对象等.然而,最终发现了个不同的地方:Form和ajax提交数据,在HttpServletRequest中尽然参数名有所不同. 数据类型 form ajax 基础数据 para=value para=value 数组 para[]={"aaa",

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

C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.Npoi 下载地址:http://npoi.codeplex.com/releases/view/38113 3.Npoi 学习系列教程推荐:http://www.cnblogs.com

nodejs实现,每天定时自动读取数据库数据-生成excel表格-发送给老板邮箱(promise版)

async版:http://blog.csdn.net/zzwwjjdj1/article/details/52129192 写这个版本主要是,promise比较好用,而且,现在已经是nodejs的内置对象了,无须再引用第三方库 -- 需要的工具 数据库    mysql 连接数据库模块 mysql  基本封装: http://blog.csdn.net/zzwwjjdj1/article/details/51991348 自动运行模块   node-schedule 基本使用 : http:/

将程序中的表格,导出生成excel表格。使用Aspose插件实现

http://www.cnblogs.com/lanyue52011/p/3372452.html这个是原文地址 /// <summary> /// 点击按钮,将内存表导出excel表格! /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Button1_Cli

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

在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下 jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011 第二步:添加poi导出工具类 1 package com.yjd.admin.util; 2 3 import java.io.IOException; 4 import ja

java中使用jxl导出Excel表格详细通用步骤

该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入session中备份一份,在调用导出方法时,从session中获取即可, 如果为后台直接导出,直接查询数据库后将结果传入即可,当然也可以在导出Excel方法中查询. 查询方法: // 获取查询结果存入session中        Object resultList = request.getAttr