文档章节

使用freemarker导出excel文件

 陪你度过漫长的岁月
发布于 2017/08/23 18:27
字数 723
阅读 44
收藏 0
点赞 0
评论 0

1. 首先新建一个excel表格demo.xlsx, 编辑好自己需要的内容.

2. 将excel表另存为.xml文件demo_export.xml

3. 按照freemarker语法进行修改, 如:

  // 主表
  <Row ss:AutoFitHeight="0" ss:Height="30">
    <Cell ss:StyleID="s25"><Data ss:Type="String">国家:</Data></Cell>
    <Cell ss:StyleID="s29"><Data ss:Type="String">${entity.country}</Data></Cell>
  </Row>
  
  // 主表中的明细, 需要遍历的
  <#list entity.mtls as mtl>
	   <Row ss:AutoFitHeight="0" ss:Height="30">
	    <Cell ss:StyleID="s18"><Data ss:Type="String">${mtl.name}</Data></Cell>
	    <Cell ss:StyleID="s18"><Data ss:Type="String">${mtl.age}</Data></Cell>
	    <Cell ss:StyleID="s18"><Data ss:Type="String">${mtl.sex}</Data></Cell>
	   </Row>
   </#list>

4. 将demo.xml文件修改为demo_export.ftl文件, 放到application.xml配置的路径.

5. application.xml中freemarker的配置.

	<!-- freemarker的配置 -->
	<bean id="freemarkerConfigurer"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPaths">
			<list>
				<value>/WEB-INF/template/</value>
			</list>
		</property>
		<property name="defaultEncoding" value="UTF-8" />
		<property name="freemarkerSettings">
			<props>
				<prop key="template_update_delay">10</prop>
				<prop key="locale">zh_CN</prop>
				<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
				<prop key="date_format">yyyy-MM-dd</prop>
				<prop key="number_format">#.##</prop>
			</props>
		</property>
	</bean>

	<!-- freemarker共用模板调用方法 -->
	<bean class="com.tmall.utils.FreemarkTemplate">
		<property name="freeMarkerConfigurer" ref="freemarkerConfigurer"></property>
	</bean>

6. com.tmall.utils.FreemarkTemplate作为工具类来处理不同需求的下载功能.

/**
* 下载
* @param response
* @param fileName 模板名
* @param contentMap 封装有打印数据的map
* @param exportName 下载名称
*/
public static void export(HttpServletResponse response, String fileName, Map<String, Object> contentMap,String exportName) {

try
{
	File outFile = new File(exportName);
	Writer writer = null;
	// 通过指定模板名获取FreeMarker模板实例
	Template template = freeMarkerConfigurer.getConfiguration().getTemplate(fileName + ".ftl");
	writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), Charset.forName("utf-8")));
	template.process(contentMap, writer);
	writer.close();
	// 设置response的编码方式
	response.setContentType("application/x-msdownload");
	// 设置附加文件名
	response.setHeader("Content-Disposition", "attachment;filename="
			+ new String(exportName.getBytes("utf-8"), "iso-8859-1"));

	// 读出文件到i/o流
	FileInputStream fis = new FileInputStream(outFile);
	BufferedInputStream buff = new BufferedInputStream(fis);

	byte[] b = new byte[1024];// 相当于我们的缓存

	long k = 0;// 该值用于计算当前实际下载了多少字节

	// 从response对象中得到输出流,准备下载
	OutputStream myout = response.getOutputStream();

	// 开始循环下载
	while (k < outFile.length())
	{
		int j = buff.read(b, 0, 1024);
		k += j;
		// 将b中的数据写到客户端的内存
		myout.write(b, 0, j);
	}
	buff.close();
	// 将写入到客户端的内存的数据,刷新到磁盘
	myout.flush();
	myout.close();
	outFile.delete();
}
catch (Exception ex)
{
	logger.error(LoggerUtils.expLog(ex));
}
}

7. 调用下载测试

@ApiOperation(value = "下载数据信息", notes = "下载数据信息", httpMethod = "GET")
@RequestMapping(value = "/demo/export", method = RequestMethod.GET)
public void export(@ApiParam(value = "主表ID") @RequestParam("id") Long id, HttpServletResponse response) {

		Person person = demoService.findById(id);

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("person", person);
        // 这里的10指的是表格的行数
		map.put("rowCount", 10 + person.getMtls().size());
		FreemarkTemplate.export(response, "demo_export", map, "导出名称"+ ".xml");
	}

特别注意: 

(1). demo_export.ftl模板文件中: 

 <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="${rowCount}" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">

上面map的rowCount键对应的值是excel表的行数.

(2). 数据类型的问题, 有时候excel表自动生成的数据类型跟我们实体类的数据类型是不一致的, 所以会导致下载的文件打不开.

 <Cell ss:StyleID="s18"><Data ss:Type="String">${mtl.name}</Data></Cell>

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 8
码字总数 1980
作品 0
利用itext导出word表格,处理图片

在实际的项目开发中我们需要将后台大量数据导出为word或者是excel方便用户操作,当然能完成这一功能的有freemarker,itext,poi等技术,本文讲述以itext导出word。 首先我们需要明白的是无论...

小夜的传说
06/26
0
0
使用freemarker生成word文档

项目有时候需要将一些内容导出成word格式,实现方式很多种,如:POI导出,freemarker导出。freemarker导出比较简单。 主要分三步: 新建一个word文档 生成模板 动态生成word。 新建一个word文...

leesama
2014/05/01
0
3
freemaker开发学习《一》

 FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面开发人...

xiaml
2014/04/25
0
0
Struts2与Freemarker的配置方法(附源码和插件)

Freemarker是模板引擎,也可以说是一种表现层的框架,它有自己的模板指令,开发者如果不熟悉这些语法,很难进行表现层的开发。Struts2框架技术对Freemarker做了很好的支持,开发人员只要熟悉...

oecp
2011/04/28
0
0
FreeMarker在eclipse中的入门例子

刚接触FreeMarker时,只是简单的了解FreeMarker的一些概念及工作原理,至于如何使用FreeMarker还不是非常清楚。随着学习的深入,才渐渐对FreeMarker有了更深入的理解。本文将从基础应用着手,...

oecp
2011/05/16
0
0
struts2导出Excel文件

这里说下struts2导出Excel文件的列子。 列子比较简单。下面是我们导出Excel需要的jar包。 struts2需要jar包:commons-logging.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2....

岳静
2012/07/19
0
0
Eclipse安装Freemarker Editor插件

Eclipse安装Freemarker Editor插件 在下面网址里下载freemarker-ide: http://sourceforge.net/projects/freemarker-ide/files/ http://sourceforge.net/projects/freemarker-ide/files/ 下载......

风中帆
2015/02/10
0
1
手把手教你新建Jfinal 项目(五)

Freemarker原理解析 2011-05-13 11:19:41| 分类: JavaEE | 标签:freemarker 模板 变量 数据模型 文件 |字号 订阅 FreeMarker生成静态页原理 FreeMarker适合于作为Web应用的表现层。freemar...

胡萝卜炒肉
2014/05/29
0
1
FreeMarker在eclipse中的入门例子

今天海浪为大家分享一个FreeMarker在eclipse中的入门例子。 一、在eclipse中创建FreeMarker模板 在FreeMarker中模板的概念就是:包含一些由${…}包围的特殊代码的文件。这些特殊代码是FreeM...

oecp
2011/04/26
0
0
分享Struts2与Freemarker的配置方法

刚才在OECP社区看到一篇文章,《Struts2与Freemarker的配置方法》觉得很好,所以转发给大家分享一下。 Freemarker是模板引擎,也可以说是一种表现层的框架,它有自己的模板指令,开发者如果不...

oecp
2011/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
37分钟前
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部