文档章节

使用freemarker导出excel文件

 陪你度过漫长的岁月
发布于 2017/08/23 18:27
字数 723
阅读 96
收藏 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
私信 提问
freemaker开发学习《一》

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

xiaml
2014/04/25
0
0
使用freemarker生成word文档

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

leesama
2014/05/01
0
3
FreeMarker在eclipse中的入门例子

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

oecp
2011/05/16
0
0
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

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部