文档章节

使用freemarker导出excel文件

 陪你度过漫长的岁月
发布于 2017/08/23 18:27
字数 723
阅读 79
收藏 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在eclipse中的入门例子

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

oecp
2011/05/16
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
Struts2与Freemarker的配置方法(附源码和插件)

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

oecp
2011/04/28
0
0
手把手教你新建Jfinal 项目(五)

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

胡萝卜炒肉
2014/05/29
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
3
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
1
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
3
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
3
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部