springMVC和FreeMarker简单方式导出excel

一般Java操作excel文件比较流行的是apache poi包。

因为我们只是导出数据,不需要读取正规的excel文件,所以我们可以通过输出html格式的xls文件来简单实现导出excel。

环境使用的springMVC,展示使用的是FreeMarker

Action

        @RequestMapping(value="export")
	public String sfnExport(HttpServletRequest request,HttpServletResponse response){
		String export_type = request.getParameter("export_type");
		request.setAttribute("export_type", export_type);
		
		Map mapYearMonth =  setYearMonth(request);
		
		List dataFrom = projSatisfactionService.findProjects(mapYearMonth.get("year"), mapYearMonth.get("month"), false);
		List dataTo = projSatisfactionService.findProjects(mapYearMonth.get("year"), mapYearMonth.get("month"), true);
		
		request.setAttribute("dataFromList", dataFrom);
		request.setAttribute("dataToList", dataTo);
		// 获取统计信息
		request.setAttribute("sum", projSatisfactionService.getStatistics(mapYearMonth.get("year"), mapYearMonth.get("month")));
		
		// 导出xls类型的html文件
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String export_date = sdf.format(new Date());
		request.setAttribute("export_date", export_date);
		String fileName = mapYearMonth.get("year")+"年"+ mapYearMonth.get("month")+"月服务评价统计_"+export_date+".xls";
		response.setContentType("application/x-download");
		response.setCharacterEncoding("UTF-8");
		response.addHeader("Content-Disposition", "attachment;filename=" + StringHelper.convertTitle(fileName));
		return "/sfn/export";
	}
ftl




导出服务评价结果









	
		<#assign index = 1> 
		<#list dataFromList as data>
		<#if data.assesslevel == 1>
			<#assign levelColor="#FF00FF">
		<#elseif data.assesslevel == 2>
			<#assign levelColor="#0000FF">
		<#elseif data.assesslevel == 3>
			<#assign levelColor="#008000">
		<#elseif data.assesslevel == 4>
			<#assign levelColor="#FF0000">
		 
		<#if export_type == "all" || export_type?contains(data.assesslevel+"")>
		
		<#assign index=index+1> 
		
		<#assign index = 1> 
		<#list dataToList as data>
		<#if data.assesslevel == 1>
			<#assign levelColor="#FF00FF">
		<#elseif data.assesslevel == 2>
			<#assign levelColor="#0000FF">
		<#elseif data.assesslevel == 3>
			<#assign levelColor="#008000">
		<#elseif data.assesslevel == 4>
			<#assign levelColor="#FF0000">
		  
		<#if export_type == "all" || export_type?contains(data.assesslevel+"")>
		
		<#assign index=index+1> 
		

服务评价结果

数据时间:${select_year}年${select_month}月 导出时间:${export_date}

统计信息

总数 未审核项目数 已审核项目数 非常满意 满意 一般 不满意
${sum["all"]} ${sum["normal"]} ${sum["approve"]} ${sum["level1"]} ${sum["level2"]} ${sum["level3"]} ${sum["level4"]}

未审核项目评价 <#if export_type="_3_4_"> (一般与不满意)

编号 未审核项目编码 未审核项目名称 审核结果
${index} ${data.projectId} ${data.projectName} ${data.assessResult}

已审核项目评价 <#if export_type="_3_4_"> (一般与不满意)

编号 已审核项目编码 已审核项目名称 审核结果
${index} ${data.projectId} ${data.projectName} ${data.assessResult}

主要分析一下ftl文件内容

1.要声明以下命名空间

2.x:num 代表此格是数据类型,x:str代表此格式字符类型,这个很重要,如果你要显示的字符中都是数字,在不设置此字符的情况下,过长的内容会被excel显示成科学计数格式。

${index}
${data.projectId}
3. 最好不要多个表格嵌套,将多个表格统一为一个表,这样才能设置col,控制每一列的宽度。否则很多地方不可控制的换行不美观。width 和mso-width-alt 参数是1:32的比例,但我只发现设置mso-width-alt有用,所以下面有几组数据width和mso-width-alt对不上是因为我只更改了mso-width-alt参数。不知道width参数可能会在什么情况下有用,目前先保留了。

 






4.action中转换方法,保障中文文件名不会乱码

        public static String convertTitle(String title){
		String str = "";
		try {
			str = new String( title.replaceAll(" ", "_").getBytes("gb2312"), "ISO8859-1" );
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return str;
	}


你可能感兴趣的:(springMVC和FreeMarker简单方式导出excel)