前面一篇文章介绍大数据量导出实现:

Java实现大批量数据导入导出(100W以上) -(二)导出

这篇文章在Excel列较少时,按以上实际验证能很快实现生成。但如果列较多时用StringTemplate写入时会出现内存溢出。那么我的解决方案如下:

将数据列表分成多份,如果从数据库查询就是分页查询出多页数据进行分批在磁盘插入。

1. 创建模板

举例Excel截图如下(有27列):

模板分三部分(head,body及foot),分别如下:

operation_data_head.st

<?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">
<CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<KSOProductBuildVer dt:dt="string">2052-11.1.0.9339</KSOProductBuildVer>
</CustomDocumentProperties>
<ExcelWorkbook
xmlns="urn:schemas-microsoft-com:office:excel">
<WindowWidth>20490</WindowWidth>
<WindowHeight>7860</WindowHeight>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<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="_ &quot;¥&quot;* #,##0_ ;_ &quot;¥&quot;* \-#,##0_ ;_ &quot;¥&quot;* &quot;-&quot;_ ;_ @_ "/>
</Style>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</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="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="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="s8" ss:Name="千位分隔">
<NumberFormat ss:Format="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &quot;-&quot;??_ ;_ @_ "/>
</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="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="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="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="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="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="s10" ss:Name="超链接">
<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#0000FF" ss:Underline="Single"/>
</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="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="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="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="s5" ss:Name="千位分隔[0]">
<NumberFormat ss:Format="_ * #,##0_ ;_ * \-#,##0_ ;_ * &quot;-&quot;_ ;_ @_ "/>
</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="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="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="s4" ss:Name="货币">
<NumberFormat
ss:Format="_ &quot;¥&quot;* #,##0.00_ ;_ &quot;¥&quot;* \-#,##0.00_ ;_ &quot;¥&quot;* &quot;-&quot;??_ ;_ @_ "/>
</Style>
<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="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="s11" ss:Name="百分比">
<NumberFormat ss:Format="0%"/>
</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="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="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="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="s12" ss:Name="已访问的超链接">
<Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#800080" ss:Underline="Single"/>
</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="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="s15" ss:Name="标题 4">
<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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="s49"/>
<Style ss:ID="s50">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
</Style>
<Style ss:ID="s51">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s52">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
</Style>
<Style ss:ID="s53">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0_ "/>
</Style>
<Style ss:ID="s54">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s55">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0_ ;[Red]\-0\ "/>
</Style>
<Style ss:ID="s56">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s57">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
</Style>
<Style ss:ID="s58">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0_ "/>
</Style>
<Style ss:ID="s59">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s60">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s61">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s62">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0_ "/>
</Style>
<Style ss:ID="s63">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#DDEBF7" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s64">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#DDEBF7" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0_ "/>
</Style>
<Style ss:ID="s65">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s66">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s67">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9"/>
<Interior/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s68">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0_ ;[Red]\-0\ "/>
</Style>
<Style ss:ID="s69">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0_ ;[Red]\-0\ "/>
</Style>
<Style ss:ID="s70">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<Interior ss:Color="#FCE4D6" ss:Pattern="Solid"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s71">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s72">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s73">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0.00_ ;[Red]\-0.00\ "/>
</Style>
<Style ss:ID="s74">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
<NumberFormat ss:Format="0_ "/>
</Style>
</Styles>
<Worksheet ss:Name="$it.sheet$">
<Table ss:ExpandedColumnCount="28" ss:ExpandedRowCount="3" x:FullColumns="1" x:FullRows="1" ss:StyleID="s52" ss:DefaultColumnWidth="54.5" ss:DefaultRowHeight="19">
<Column ss:Index="1" ss:StyleID="s51" ss:AutoFitWidth="0" ss:Width="176.25"/>
<Column ss:Index="2" ss:StyleID="s51" ss:AutoFitWidth="0" ss:Width="91.5"/>
<Column ss:StyleID="s52" ss:AutoFitWidth="0" ss:Width="85"/>
<Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="45.5" ss:Span="1"/>
<Column ss:Index="6" ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="85"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="55" ss:Span="2"/>
<Column ss:Index="10" ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="55"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="64.5"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="45.5" ss:Span="1"/>
<Column ss:Index="14" ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="27"/>
<Column ss:StyleID="s51" ss:AutoFitWidth="0" ss:Width="62"/>
<Column ss:StyleID="s51" ss:AutoFitWidth="0" ss:Width="64.5"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="117.5"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="121.5" ss:Span="1"/>
<Column ss:Index="20" ss:StyleID="s54"/>
<Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="45.5"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="45.5" ss:Span="1"/>
<Column ss:Index="24" ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="55"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="45.5"/>
<Column ss:StyleID="s55" ss:AutoFitWidth="0" ss:Width="45.5"/>
<Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="64.5"/>
<Column ss:StyleID="s55" ss:AutoFitWidth="0" ss:Width="45.5"/>
<Row ss:StyleID="s50">
<Cell ss:StyleID="s71" ss:MergeAcross="5">
<Data ss:Type="String">基础信息</Data>
</Cell>
<Cell ss:StyleID="s72" ss:MergeAcross="3">
<Data ss:Type="String">订单信息(统计周期内)</Data>
</Cell>
<Cell ss:StyleID="s73" ss:MergeAcross="8">
<Data ss:Type="String">销售信息(统计周期内)</Data>
</Cell>
<Cell ss:StyleID="s67">
<Data ss:Type="String">库存信息</Data>
</Cell>
<Cell ss:StyleID="s74" ss:MergeAcross="7">
<Data ss:Type="String">保理/融资信息(统计周期内)</Data>
</Cell>
</Row>
<Row ss:StyleID="s50">
<Cell ss:StyleID="s60">
<Data ss:Type="String">供应商名称</Data>
</Cell>
<Cell ss:StyleID="s60">
<Data ss:Type="String">供应商组号</Data>
</Cell>
<Cell ss:StyleID="s61">
<Data ss:Type="String">首次合同签署时间</Data>
</Cell>
<Cell ss:StyleID="s62">
<Data ss:Type="String">卡号数量</Data>
</Cell>
<Cell ss:StyleID="s62">
<Data ss:Type="String">卡号账期</Data>
</Cell>
<Cell ss:StyleID="s62">
<Data ss:Type="String">异常状态卡号数量</Data>
</Cell>
<Cell ss:StyleID="s63">
<Data ss:Type="String">订货单金额</Data>
</Cell>
<Cell ss:StyleID="s63">
<Data ss:Type="String">送货单金额</Data>
</Cell>
<Cell ss:StyleID="s63">
<Data ss:Type="String">退货单金额</Data>
</Cell>
<Cell ss:StyleID="s64">
<Data ss:Type="String">订货单数量</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">未税销售金额</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">综合毛利</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">净毛利</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">费用</Data>
</Cell>
<Cell ss:StyleID="s66">
<Data ss:Type="String">是否有进货记录</Data>
</Cell>
<Cell ss:StyleID="s66">
<Data ss:Type="String">是否有销售记录</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">90天销售额(T-1至T-90)</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">90天销售额(T-91至T-180)</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">90天综合毛利(T-1至T-90)</Data>
</Cell>
<Cell ss:StyleID="s63">
<Data ss:Type="String">期末库存</Data>
</Cell>
<Cell ss:StyleID="s62">
<Data ss:Type="String">放款笔数</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">放款金额</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">放款利息</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">保理手续费</Data>
</Cell>
<Cell ss:StyleID="s65">
<Data ss:Type="String">逾期罚息</Data>
</Cell>
<Cell ss:StyleID="s69">
<Data ss:Type="String">逾期次数</Data>
</Cell>
<Cell ss:StyleID="s70">
<Data ss:Type="String">月均放款额度</Data>
</Cell>
<Cell ss:StyleID="s69">
<Data ss:Type="String">坏账笔数</Data>
</Cell>
</Row>

operation_data_body.st

 $worksheet:{
$it.rows:{
<Row>
<Cell ss:StyleID="s51">
<Data ss:Type="String">$it.supplierName$</Data>
</Cell>
<Cell ss:StyleID="s51">
<Data ss:Type="String">$it.groupNumber$</Data>
</Cell>
<Cell ss:StyleID="s52">
<Data ss:Type="String">$it.firstContYear$</Data>
</Cell>
<Cell ss:StyleID="s53">
<Data ss:Type="String">$it.cardNumber$</Data>
</Cell>
<Cell ss:StyleID="s53">
<Data ss:Type="String">$it.cardPeriod$</Data>
</Cell>
<Cell ss:StyleID="s53">
<Data ss:Type="String">$it.badCardNumber$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.orderAmount$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.receiveOrderAmount$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.backOrderAmount$</Data>
</Cell>
<Cell ss:StyleID="s53">
<Data ss:Type="String">$it.orderNumber$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.saleAmount$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.conPg$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.netPg$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.fee$</Data>
</Cell>
<Cell ss:StyleID="s51">
<Data ss:Type="String">$it.receiveRecord$</Data>
</Cell>
<Cell ss:StyleID="s51">
<Data ss:Type="String">$it.saleRecord$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.saleAmount90$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.saleAmount180$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.conPg90$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.endInventAm$</Data>
</Cell>
<Cell ss:StyleID="s53">
<Data ss:Type="String">$it.makeLoanNum$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.makeLoanAm$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.makeLoanInt$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.factFee$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.overdueInt$</Data>
</Cell>
<Cell ss:StyleID="s55">
<Data ss:Type="String">$it.overdueNum$</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">$it.avgMakeLoanAm$</Data>
</Cell>
<Cell ss:StyleID="s55">
<Data ss:Type="String">$it.lossNum$</Data>
</Cell>
</Row>
}$
}$

operation_data_foot.st

       </Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.511805555555556"/>
<Footer x:Margin="0.511805555555556"/>
</PageSetup>
<Selected/>
<TopRowVisible>0</TopRowVisible>
<LeftColumnVisible>0</LeftColumnVisible>
<PageBreakZoom>100</PageBreakZoom>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>9</ActiveRow>
<ActiveCol>1</ActiveCol>
<RangeSelection>R10C2</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
<DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
<Range>C1</Range>
<InputHide/>
<ErrorHide/>
<ErrorStyle>Stop</ErrorStyle>
</DataValidation>
</Worksheet>
</Workbook>

2. 引入必要Jar

我利用StringTemplate模板解析技术对XML模板进行填充。当然也可以使用FreeMarker, Velocity等Java模板技术实现。

首先引入StringTemplate所需Jar包:

使用技术为 stringTemplate

pom.xml:

 1   <dependency>
2 <groupId>antlr</groupId>
3 <artifactId>antlr</artifactId>
4 <version>2.7.7</version>
5 </dependency>
6
7 <dependency>
8 <groupId>org.antlr</groupId>
9 <artifactId>stringtemplate</artifactId>
10 <version>3.2.1</version>
11 </dependency>

3. 创建JavaBean

创建对应绑定Java对象:

Worksheet.java
import java.util.List;

/**
* 类功能描述:Excel sheet Bean
*
* @author WangXueXing create at 19-4-13 下午10:21
* @version 1.0.0
*/
public class Worksheet<T> {
private String sheet;
private int columnNum;
private int rowNum;
private List<T> rows; public String getSheet() {
return sheet;
}
public void setSheet(String sheet) {
this.sheet = sheet;
} public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
} public int getColumnNum() {
return columnNum;
}
public void setColumnNum(int columnNum) {
this.columnNum = columnNum;
} public int getRowNum() {
return rowNum;
}
public void setRowNum(int rowNum) {
this.rowNum = rowNum;
}
}

具体对应列对象:

OperationData.java
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Value;
import lombok.experimental.Accessors; /**
* @ClassName OperationData
* @Description TODO
* @Author wangxuexing
* @Date 2020/2/14 12:04
* @Version 1.0
*/
@Data
@EqualsAndHashCode()
@Accessors(chain = true)
public class OperationData {
/*基础信息*/
private String supplierName; // 供应商名称
private String groupNumber; // 供应商组号
private String firstContYear; // 首次合同签署时间
private String cardNumber; // 卡号数量
private String cardPeriod; // 卡号账期
private String badCardNumber; // 异常状态卡号数量 /*订单信息*/
private String orderAmount; // 订货单金额
private String receiveOrderAmount; // 送货单金额
private String backOrderAmount; // 退货单金额
private String orderNumber; // 订货单数量 /*销售信息*/
private String saleAmount; // 未税销售金额
private String conPg; // 综合毛利
private String netPg; // 净毛利
private String fee; // 费用
private String receiveRecord;
private String saleRecord;
private String saleAmount90; // 90天销售额(T-1至T-90)
private String saleAmount180; // 90天销售额(T-91至T-180)
private String conPg90; // 90天综合毛利(T-1至T-90) /*库存信息*/
private String endInventAm; // 期末库存 /*保理/融资信息*/
private String makeLoanNum; // 放款笔数
private String makeLoanAm; // 放款金额
private String makeLoanInt; // 放款利息
private String factFee; // 保理手续费
private String overdueInt; // 逾期罚息
private String overdueNum; // 逾期次数
private String avgMakeLoanAm;
private String lossNum; // 坏账笔数
}

4. 生成Excel

首先生成100万条数据:

        List<OperationData> dataList = Lists.newArrayList();
for(int i=0; i<1000000; i++){
int val = (int)(Math.random()*10+1);
OperationData operationData = new OperationData();
operationData.setAvgMakeLoanAm("4343"+val).setBackOrderAmount("4343"+val).setBadCardNumber("4343"+val)
.setCardPeriod("4343"+val).setConPg("4343"+val)
.setConPg90("4343"+val).setEndInventAm("4343"+val).setEndInventAm("4343"+val)
.setFactFee("4343"+val).setFee("4343"+val).setFirstContYear("4343"+val).setLossNum("4343"+val)
.setGroupNumber("4343"+val).setCardNumber("4343"+val)
.setMakeLoanInt("4343"+val).setMakeLoanNum("4343"+val)
.setNetPg("4343"+val).setOrderAmount("4343"+val).setOverdueInt("4343"+val)
.setMakeLoanAm("4343"+val).setOverdueNum("4343"+val)
.setOverdueNum("4343"+val).setSaleAmount("4343"+val).setReceiveOrderAmount("4343"+val)
.setSaleAmount90("4343"+val).setSaleAmount180("4343"+val)
.setSaleRecord("4343"+val).setSupplierName("4343"+val)
.setOrderNumber("4343"+val).setReceiveRecord("4343"+val);
dataList.add(operationData);
}

我们假定每次插入Excel为2万行,我们先拆分这100万行数据:

拆分方法如下:

    /**
* 将一个list均分成n个list,主要通过偏移量来实现的
* @param source
* @return
*/
public static <T> List<List<T>> averageAssignList(List<T> source, int n) {
List<List<T>> result = new ArrayList<List<T>>();
int remaider = source.size() % n; //(先计算出余数)
int number = source.size() / n; //然后是商
int offset = 0;//偏移量
for (int i = 0; i < n; i++) {
List<T> value = null;
if (remaider > 0) {
value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
remaider--;
offset++;
} else {
value = source.subList(i * number + offset, (i + 1) * number + offset);
}
result.add(value);
}
return result;
}

最后,我们来看下我们生成Excel方法如下:

    /**
* 写入单个Sheet的Excel
* @param templatePrefix 模板前缀,默认两个模板后缀分别为head及body
* @param outFile 生成Excel文件
* @param sheetName 单个sheet名称
* @param dataList 填充数据列表
* @param <T> 填充对象泛型
* @throws FileNotFoundException
* @throws ClassNotFoundException
*/
public static <T> void writeExcelOneSheetByList(String templatePrefix, File outFile, String sheetName, Class clazz, List<List<T>> dataList){
long startTimne = System.currentTimeMillis();
StringTemplateGroup stGroup = new StringTemplateGroup(String.valueOf(startTimne));
try(PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(outFile)))) {
//写入excel文件头部信息
StringTemplate head = stGroup.getInstanceOf("template"+File.separator+templatePrefix+"head");
writer.print(head.toString());
writer.flush();
//excel单表最大行数是65535
Field[] fields = clazz.getDeclaredFields();
dataList.forEach(x->{
long startTimne1 = System.currentTimeMillis();
//写入excel文件数据信息
StringTemplate body = stGroup.getInstanceOf("template"+File.separator+templatePrefix+"body");
Worksheet worksheet = new Worksheet();
worksheet.setSheet(sheetName);
worksheet.setColumnNum(fields.length);
worksheet.setRowNum(ONE_SHEET_LIMIT_ROW);
worksheet.setRows(x);
body.setAttribute("worksheet", worksheet);
writer.print(body.toString());
writer.flush();
long endTime1 = System.currentTimeMillis();
System.out.println("用时="+((endTime1-startTimne1)/1000)+"秒");
});
//写入excel文件头部信息
StringTemplate foot = stGroup.getInstanceOf("template"+File.separator+templatePrefix+"foot");
writer.print(foot.toString());
writer.flush();
} catch (Exception e) {
log.error("写入Excel异常", e);
}
long endTime = System.currentTimeMillis();
System.out.println("用时="+((endTime-startTimne)/1000)+"秒");
}

这样就不会导致生成Excel时内存溢出了。

整体代码如果需要,请留言并附联系方式,我会抽时间发送。

源码:exportexcel.zip

Java实现大批量数据导入导出(100W以上) -(三)超过25列Excel导出的更多相关文章

  1. Java实现大批量数据导入导出(100W以上) -(二)导出

    使用POI或JXLS导出大数据量(百万级)Excel报表常常面临两个问题: 1. 服务器内存溢出: 2. 一次从数据库查询出这么大数据,查询缓慢. 当然也可以分页查询出数据,分别生成多个Excel打包 ...

  2. Java实现大批量数据导入导出(100W以上) -(一)导入

    最近业务方有一个需求,需要一次导入超过100万数据到系统数据库.可能大家首先会想,这么大的数据,干嘛通过程序去实现导入,为什么不直接通过SQL导入到数据库. 大数据量报表导出请参考:Java实现大批量 ...

  3. java大批量数据导入(MySQL)

    © 版权声明:本文为博主原创文章,转载请注明出处 最近同事碰到大批量数据导入问题,因此也关注了一下.大批量数据导入主要存在两点问题:内存溢出和导入速率慢. 内存溢出:将文件中的数据全部取出放在集合中, ...

  4. JAVA实现数据库数据导入/导出到Excel(POI)

    准备工作: 1.导入POI包:POI下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/poi/release/src/(重要) 如下 2.导入Java界面美 ...

  5. Java实现Mysql数据导入导出

    package com.backup; import java.io.BufferedReader;import java.io.FileInputStream;import java.io.File ...

  6. SQL Server通过BCP进行大批量数据导入导出

    预置条件: 使用sa帐号登录SQL Server Management Studio,右键点击安全性-登录名-数据库用户名属性,设置服务器角色为sysadmin. 删除已存在的存储过程 String ...

  7. Java将数据库数据导入EXCEL

    一般的数据库数据怎么导入excel中呢??这让人非常疑惑,今天我找到了一个方法能够实现 须要导入一个第三方包下载地址 详细内容例如以下: 里面含有指导文档,index.html里面含有怎样读取数据库文 ...

  8. JAVA 实现数据导入Phoenix

    需要导入的jar 包有: 实现代码: package cn.test; import java.sql.Connection; import java.sql.DriverManager; impor ...

  9. postgresql大批量数据导入方法

    一直没有好好关注这个功能,昨天看了一下,数据库插入有瓶颈,今天研究了一下: 主要有以下方案: 1.使用copy从文件导入: copy table_001(a, b, "f", d, ...

随机推荐

  1. 页面在谷歌浏览器和IE浏览器顶部多出空白行,火狐显示正常

    引起这个问题的原因是用系统自带记事本打开过Tinkphp的模板文件,因为记事本不支持UTF8无BOM格式编码,打开之后这个编码格式丢失,转为ANSI格式的编码了: 解决的办法是:用Notepad++或 ...

  2. vue 生命钩子周期之理解

    对于vue的初学者来说,理解vue的生命钩子周期是很有必要的.什么是生命钩子周期呢,顾名思义就是 “实例初始化”  到  “实例被销毁” 的过程. 理解vue的生命钩子周期,我们就可以更好的在项目中运 ...

  3. Eclipse使用段注释格式化代码后混乱情况解决

    今天在Eclipse写代码用到段注释代码块注释一个方法,习惯使用格式化代码,结果一看格式化后的代码就乱了.就像下面那样. 觉得太乱了,而且不好对比检查.如果取消注释中间的**还保存了的,好纠结.于是就 ...

  4. idea中的springboot+gradle项目报错springboot configuration annotation processor not found in classpath

    idea中的springboot项目,打开某个类run.halo.app.config.properties.HaloProperties.java,报错(使用gradle编译): springboo ...

  5. zabbix-agent不能启动:配置文件出现特殊字符导致

    问题如下: 定位查找问题: 命令:journalctl  -xe [重点] 图中可见错误信息在zabbix_agent配置文件中的“hostname=”中不能出现特殊字符,我出错的原因是写成了:hos ...

  6. C#中的switch

    switch 表达式支持的类型为 sbyte.byte.short.ushort.int.uint.long.ulong.char.string 或枚举类型,或者可以隐试转换到这些类型的自定义对象或其 ...

  7. 【使用python urllib时出现[SSL: CERTIFICATE_VERIFY_FAILED]报错的解决方案】

    "首先,这个报错是告诉你,你的证书有问题. 其次,出现这个问题的原因,在于Python本身. 问题原因 Python升级到2.7.9以后,引入了一个新特性. 当使用urllib打开https ...

  8. ORACLE_BASE、ORACLE_HOME有什么区别

    ORACLE_BASE.ORACLE_HOME有什么区别   ORACLE_BASE下是admin和productORACLE_HOME下则是ORACLE的命令.连接库.安装助手.listener等等 ...

  9. windows10下VS2013搭建opencv2.4.9吐血之作

    1.下载opencv2.4.9.exe文件,然后双击extract文件到指定目录 2.按此链接安装opencv:https://www.cnblogs.com/cuteshongshong/p/405 ...

  10. 2019年小结&2020年展望

    每篇一句 If you want love, then this is it. This is real life. It's not perfect but it's real. --Before ...