文档章节

使用freemarker导出excel文件

 陪你度过漫长的岁月
发布于 2017/08/23 18:27
字数 723
阅读 61
收藏 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
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

没有更多内容

加载失败,请刷新页面

加载更多

xilinx资源

本系列教学视频由赛灵思高级战略应用工程师带领你:从零开始,一步步深入 掌握 HLS 以及 UltraFAST 设计方法,帮助您成为系统设计和算法加速的大拿! http://www.eetrend.com/topics/2018-0...

whoisliang
11分钟前
0
0
=====BJmeter性能测试小接=====

一、性能测试分类 1、负载测试: 通过逐步加压的方法,达到既定的性能阈值的目标,阈值的设定应是小于某个值,如cpu使用率小于等于80% 2、压力测试: 通过逐步加压的方法,使得系统的某些资源...

覃光林
14分钟前
0
0
企业级开源四层负载均衡解决方案--LVS

网盘链接 企业级开源四层负载均衡解决方案--LVS 本课程将在Linux环境下,学习配置使用LVS,对Web集群和MySQL集群进行负载均衡,并结合利用Keepalived实现负载均衡器的高可用,实现对后端Rea...

qq__2304636824
20分钟前
0
0
Windows上安装Spacemacs

emacs安装 下载地址emacs 安装比较简单,解压后执行\bin\addpm.exe即可 emacs配置 emacs的默认配置文件路径和.emacs.d文件夹都是在Windows主目录下的 C:\Users\Administrator\AppData\Roami...

yxmsw2007
35分钟前
0
0
OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
191
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部