使用freemarker导出excel文件
使用freemarker导出excel文件
陪你度过漫长的岁月 发表于3个月前
使用freemarker导出excel文件
  • 发表于 3个月前
  • 阅读 6
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 使用freemarker可以导出复杂, 自定义的excel表文件.

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>

标签: FreeMarker excel
共有 人打赏支持
粉丝 0
博文 2
码字总数 1980
×
陪你度过漫长的岁月
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: