springmvc下解析模板生成Excel ,用freemarker

版权声明:转载说明出处,谢谢。 https://blog.csdn.net/Black_PL/article/details/80376573

工具类解析模板生成Excel

public class TemplateParseUtil {
	/** 
     * 解析模板生成Excel 
     * @param templateDir  模板目录 
     * @param templateName 模板名称 
     * @param excelPath 生成的Excel文件路径 
     * @param data 数据参数 
     * @throws IOException 
     * @throws TemplateException 
     */  
    public static void parse(String templateDir,String templateName,String excelPath,Map<String,Object> data) throws IOException, TemplateException {  
        //初始化工作  
        Configuration cfg = new Configuration();  
        //设置默认编码格式为UTF-8  
        cfg.setDefaultEncoding("UTF-8");   
        //全局数字格式  
        cfg.setNumberFormat("0.00");  
        //设置模板文件位置  
        cfg.setDirectoryForTemplateLoading(new File(templateDir));  
        cfg.setObjectWrapper(new DefaultObjectWrapper());  
        //加载模板  
        Template template = cfg.getTemplate(templateName,"utf-8");  
        OutputStreamWriter writer = null;  
        try{  
            //填充数据至Excel  
            writer = new OutputStreamWriter(new FileOutputStream(excelPath),"UTF-8");  
            template.process(data, writer);  
            writer.flush();  
        }finally{  
            writer.close();  
        }     
    }  
  
  
    /** 
     * 解析模板返回字节数组 
     * @param templateDir  模板目录 
     * @param templateName 模板名称 
     * @param data 数据参数 
     * @throws IOException 
     * @throws TemplateException 
     */  
    public static byte[] parse(String templateDir,String templateName,Map<String,Object> data) throws TemplateException, IOException{  
        Configuration cfg = new Configuration();  
        cfg.setDefaultEncoding("UTF-8");  
        cfg.setNumberFormat("0.00");  
        cfg.setDirectoryForTemplateLoading(new File(templateDir));  
        cfg.setObjectWrapper(new DefaultObjectWrapper());  
        Template template = cfg.getTemplate(templateName,"utf-8");  
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
        Writer out = new OutputStreamWriter(outStream,"UTF-8");  
        template.process(data, out);  
        return outStream.toByteArray();  
    }  
      
    /** 
     * 自定义模板字符串解析 
     * @param templateStr  模板字符串 
     * @param data 数据   
     * @return 解析后的字符串 
     * @throws IOException 
     * @throws TemplateException 
     */  
    public static String parse(String templateStr, Map<String, Object> data)  
            throws IOException, TemplateException {  
        Configuration cfg = new Configuration();  
        cfg.setNumberFormat("#.##");  
        //设置装载模板  
        StringTemplateLoader stringLoader = new StringTemplateLoader();   
        stringLoader.putTemplate("myTemplate", templateStr);      
        cfg.setTemplateLoader(stringLoader);  
        //加载装载的模板  
        Template temp = cfg.getTemplate("myTemplate", "utf-8");  
        Writer out = new StringWriter();  
        temp.process(data, out);  
        return out.toString();  
    }  
}

模板文件excel.ft

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
	xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"
	xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"
	xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
	<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
		<Author>mocking</Author>
		<LastAuthor>‎</LastAuthor>
		<Created>2018-05-17T06:23:39Z</Created>
		<LastSaved>2018-05-17T06:31:50Z</LastSaved>
	</DocumentProperties>
	<CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
		<KSOProductBuildVer dt:dt="string">2052-10.1.0.7346
		</KSOProductBuildVer>
	</CustomDocumentProperties>
	<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
		<WindowWidth>27525</WindowWidth>
		<WindowHeight>13650</WindowHeight>
		<ProtectStructure>False</ProtectStructure>
		<ProtectWindows>False</ProtectWindows>
	</ExcelWorkbook>
	<Styles>
		<Style ss:ID="s40" ss:Name="强调文字颜色 4">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#FFC000" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s35" ss:Name="20% - 强调文字颜色 1">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#DDEBF7" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s32" ss:Name="适中">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#9C6500" />
			<Interior ss:Color="#FFEB9C" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s27" ss:Name="20% - 强调文字颜色 6">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#E2EFDA" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s20" ss:Name="标题 2">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="2" ss:Color="#5B9BD5" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="13" ss:Color="#44546A"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s16" ss:Name="警告文本">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FF0000" />
		</Style>
		<Style ss:ID="s1" ss:Name="货币[0]">
			<NumberFormat
				ss:Format="_ "¥"* #,##0_ ;_ "¥"* \-#,##0_ ;_ "¥"* "-"_ ;_ @_ " />
		</Style>
		<Style ss:ID="s8" ss:Name="千位分隔">
			<NumberFormat
				ss:Format="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * "-"??_ ;_ @_ " />
		</Style>
		<Style ss:ID="s43" ss:Name="强调文字颜色 5">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#4472C4" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s31" ss:Name="好">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#006100" />
			<Interior ss:Color="#C6EFCE" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s14" ss:Name="60% - 强调文字颜色 2">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#F4B084" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s9" ss:Name="60% - 强调文字颜色 3">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#C9C9C9" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s7" ss:Name="差">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#9C0006" />
			<Interior ss:Color="#FFC7CE" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s48" ss:Name="60% - 强调文字颜色 6">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#A9D08E" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s33" ss:Name="20% - 强调文字颜色 5">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#D9E1F2" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s30" ss:Name="汇总">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#5B9BD5" />
				<Border ss:Position="Top" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#5B9BD5" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s6" ss:Name="40% - 强调文字颜色 3">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#DBDBDB" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s44" ss:Name="40% - 强调文字颜色 5">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#B4C6E7" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s25" ss:Name="计算">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Left" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Right" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Top" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FA7D00"
				ss:Bold="1" />
			<Interior ss:Color="#F2F2F2" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s19" ss:Name="标题 1">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="2" ss:Color="#5B9BD5" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="15" ss:Color="#44546A"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s13" ss:Name="注释">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#B2B2B2" />
				<Border ss:Position="Left" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#B2B2B2" />
				<Border ss:Position="Right" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#B2B2B2" />
				<Border ss:Position="Top" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#B2B2B2" />
			</Borders>
			<Interior ss:Color="#FFFFCC" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="Default" ss:Name="Normal">
			<Alignment />
			<Borders />
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12" />
			<Interior />
			<NumberFormat />
			<Protection />
		</Style>
		<Style ss:ID="s2" ss:Name="20% - 强调文字颜色 3">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#EDEDED" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s5" ss:Name="千位分隔[0]">
			<NumberFormat ss:Format="_ * #,##0_ ;_ * \-#,##0_ ;_ * "-"_ ;_ @_ " />
		</Style>
		<Style ss:ID="s46" ss:Name="强调文字颜色 6">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#70AD47" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s45" ss:Name="60% - 强调文字颜色 5">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#8EA9DB" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s37" ss:Name="20% - 强调文字颜色 2">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#FCE4D6" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s34" ss:Name="强调文字颜色 1">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#5B9BD5" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s26" ss:Name="检查单元格">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#3F3F3F" />
				<Border ss:Position="Left" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#3F3F3F" />
				<Border ss:Position="Right" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#3F3F3F" />
				<Border ss:Position="Top" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#3F3F3F" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF"
				ss:Bold="1" />
			<Interior ss:Color="#A5A5A5" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s22" ss:Name="标题 3">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="2" ss:Color="#ACCCEA" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#44546A"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s17" ss:Name="标题">
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="18" ss:Color="#44546A"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s10" ss:Name="超链接">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#0000FF"
				ss:Underline="Single" />
		</Style>
		<Style ss:ID="s4" ss:Name="货币">
			<NumberFormat
				ss:Format="_ "¥"* #,##0.00_ ;_ "¥"* \-#,##0.00_ ;_ "¥"* "-"??_ ;_ @_ " />
		</Style>
		<Style ss:ID="s47" ss:Name="40% - 强调文字颜色 6">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#C6E0B4" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s41" ss:Name="20% - 强调文字颜色 4">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#FFF2CC" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s38" ss:Name="40% - 强调文字颜色 2">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#F8CBAD" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s3" ss:Name="输入">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Left" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Right" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
				<Border ss:Position="Top" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#7F7F7F" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#3F3F76" />
			<Interior ss:Color="#FFCC99" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s39" ss:Name="强调文字颜色 3">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#A5A5A5" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s24" ss:Name="输出">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#3F3F3F" />
				<Border ss:Position="Left" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#3F3F3F" />
				<Border ss:Position="Right" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#3F3F3F" />
				<Border ss:Position="Top" ss:LineStyle="Continuous"
					ss:Weight="1" ss:Color="#3F3F3F" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#3F3F3F"
				ss:Bold="1" />
			<Interior ss:Color="#F2F2F2" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s23" ss:Name="60% - 强调文字颜色 4">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#FFD966" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s21" ss:Name="60% - 强调文字颜色 1">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#9BC2E6" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s18" ss:Name="解释性文本">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#7F7F7F"
				ss:Italic="1" />
		</Style>
		<Style ss:ID="s15" ss:Name="标题 4">
			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#44546A"
				ss:Bold="1" />
		</Style>
		<Style ss:ID="s12" ss:Name="已访问的超链接">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#800080"
				ss:Underline="Single" />
		</Style>
		<Style ss:ID="s11" ss:Name="百分比">
			<NumberFormat ss:Format="0%" />
		</Style>
		<Style ss:ID="s42" ss:Name="40% - 强调文字颜色 4">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#FFE699" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s36" ss:Name="40% - 强调文字颜色 1">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000" />
			<Interior ss:Color="#BDD7EE" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s29" ss:Name="链接单元格">
			<Borders>
				<Border ss:Position="Bottom" ss:LineStyle="Double" ss:Weight="3"
					ss:Color="#FF8001" />
			</Borders>
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FA7D00" />
		</Style>
		<Style ss:ID="s28" ss:Name="强调文字颜色 2">
			<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#FFFFFF" />
			<Interior ss:Color="#ED7D31" ss:Pattern="Solid" />
		</Style>
		<Style ss:ID="s49" />
		<Style ss:ID="s50">
			<Alignment ss:Horizontal="Center" />
		</Style>
	</Styles>
	<Worksheet ss:Name="Sheet1">
		<Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="${rsvCountList?size + 2}"
			x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54"
			ss:DefaultRowHeight="14.25">
			<Row>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">所在市</Data>
				</Cell>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">大(1)型</Data>
				</Cell>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">大(2)型</Data>
				</Cell>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">中型</Data>
				</Cell>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">小(1)型</Data>
				</Cell>
				 <Cell ss:StyleID="s50">
					<Data ss:Type="String">小(2)型</Data>
				</Cell>
				<Cell ss:StyleID="s50">
					<Data ss:Type="String">合计</Data>
				</Cell>
			</Row>
			
			 <#list rsvCountList as rsv>  
   			 
   			 <Row ss:Index="${rsv_index+2}">  

			    <Cell><Data ss:Type="String">${rsv.name!}</Data></Cell>
			    <#list rsv.countList as c> 
				    <Cell><Data ss:Type="String">${c.count!}</Data></Cell>  
			 	</#list>
			 	<Cell><Data ss:Type="String">${rsv.count!}</Data></Cell>
			 </Row>
			 </#list>  
		</Table>
		<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
			<PageSetup>
				<Header x:Margin="0.511111111111111" />
				<Footer x:Margin="0.511111111111111" />
			</PageSetup>
			<Selected />
			<TopRowVisible>0</TopRowVisible>
			<LeftColumnVisible>0</LeftColumnVisible>
			<PageBreakZoom>100</PageBreakZoom>
			<Panes>
				<Pane>
					<Number>3</Number>
					<ActiveRow>0</ActiveRow>
					<ActiveCol>7</ActiveCol>
					<RangeSelection>R1C8</RangeSelection>
				</Pane>
			</Panes>
			<ProtectObjects>False</ProtectObjects>
			<ProtectScenarios>False</ProtectScenarios>
		</WorksheetOptions>
	</Worksheet>
	<Worksheet ss:Name="Sheet2">
		<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1"
			x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54"
			ss:DefaultRowHeight="14.25" />
		<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
			<PageSetup>
				<Header x:Margin="0.511111111111111" />
				<Footer x:Margin="0.511111111111111" />
			</PageSetup>
			<TopRowVisible>0</TopRowVisible>
			<LeftColumnVisible>0</LeftColumnVisible>
			<PageBreakZoom>100</PageBreakZoom>
			<ProtectObjects>False</ProtectObjects>
			<ProtectScenarios>False</ProtectScenarios>
		</WorksheetOptions>
	</Worksheet>
	<Worksheet ss:Name="Sheet3">
		<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1"
			x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54"
			ss:DefaultRowHeight="14.25" />
		<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
			<PageSetup>
				<Header x:Margin="0.511111111111111" />
				<Footer x:Margin="0.511111111111111" />
			</PageSetup>
			<TopRowVisible>0</TopRowVisible>
			<LeftColumnVisible>0</LeftColumnVisible>
			<PageBreakZoom>100</PageBreakZoom>
			<ProtectObjects>False</ProtectObjects>
			<ProtectScenarios>False</ProtectScenarios>
		</WorksheetOptions>
	</Worksheet>
</Workbook> 

一定要注意标红处,

ss:ExpandedRowCount="${rsvCountList?size + 2}

注:这里一定要改,因为这里设置的是excel的行数,要动态的加载数据,则行数也要跟着改变(设置的行数必须>=实际的行数,不然生成的excel会打不开),${RsvCountList?size + 6}是得到userList的大小加上原来标题格式所占的6行,${list?size}可以得到list的大小。

<#list rsvCountList as rsv>  
   			 
   			 <Row ss:Index="${rsv_index+2}">  

			    <Cell><Data ss:Type="String">${rsv.name!}</Data></Cell>
			    <#list rsv.countList as c> 
				    <Cell><Data ss:Type="String">${c.count!}</Data></Cell>  
			 	</#list>
			 	<Cell><Data ss:Type="String">${rsv.count!}</Data></Cell>
			 </Row>
			 </#list> 

循环遍历 RsvCountList的标签(内部又有list遍历)

解决模板读取和excel文件生成的路径问题

public void excelTest(HttpServletResponse response,HttpServletRequest request) throws IOException{
List<RsvCountList> rsvCountList = GetRsvCanton();
//测试Excel文件生成
Map<String,Object> data = new HashMap<String, Object>();
data.put("rsvCountList", rsvCountList);
Date now = new Date();
String filename = "/resources/TempFiles/excel"+now.getTime()+".xls";
String nodepath = this.getClass().getClassLoader().getResource("/").getPath(); 
String substring = nodepath+"../../";
String path2=substring+"/resources/template";

try {
TemplateParseUtil.parse(path2, "excel.ftl", substring+filename, data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.sendRedirect("./"+filename);
   } 


导出其它格式文件参考https://blog.csdn.net/u010722643/article/details/41732607

猜你喜欢

转载自blog.csdn.net/Black_PL/article/details/80376573