在工作中有时会遇到百万级数据导出的场景, 使用poi
或jxls
存在大量的节点对象操作, 经常会面临以下问题:
那么有什么解决方案呢?
可以使用XML格式利用模板填充技术, 分页查询出数据从磁盘写入XML, 最终以Excel多sheet形式生成. 模板技术有FreeMarker
, Velocity
, StringTemplate
等.
本篇我将采用StringTemplate
模板技术对XML格式模板进行数据填充操作, 底层原理返璞归真, 用的是基础IO
流实现. 同样的, 本篇我会记录自己学习过程中采用反射技术封装的工具方法 . 简单的入门案例我这就不详细写了, 可以参考以下博客:
Java实现大批量数据导入导出(百万以上)-导出
Java 使用stringTemplate导出大批量数据excel(百万级)
<dependency>
<groupId>org.antlrgroupId>
<artifactId>stringtemplateartifactId>
<version>3.2.1version>
dependency>
<dependency>
<groupId>antlrgroupId>
<artifactId>antlrartifactId>
<version>2.7.7version>
dependency>
<dependency>
<groupId>com.google.code.google-collectionsgroupId>
<artifactId>google-collectartifactId>
<version>snapshot-20080530version>
dependency>
既然是模板填充技术, 那就需要准备被填充的数据模板文件, 创建方式:
(1) 打开Excel, 创建一个Sheet表, 设置好自己需要的标题行和单元格样式;
(2)
另存为
, 选择以xml表格
方式保存.(3) 然后用
notepad++
等记事本打开xml模板文件, 提取xml模板头部(head.st
), 数据体部分(body.st
)和尾部(foot.st
).
xml模板不做分割, 整个xml文件作为填充模板使用.
template/st/test.st
<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">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Created>1996-12-17T01:32:42ZCreated>
<LastSaved>2013-08-02T09:21:24ZLastSaved>
<Version>11.9999Version>
DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<RemovePersonalInformation/>
OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>4530WindowHeight>
<WindowWidth>8505WindowWidth>
<WindowTopX>480WindowTopX>
<WindowTopY>120WindowTopY>
<AcceptLabelsInFormulas/>
<ProtectStructure>FalseProtectStructure>
<ProtectWindows>FalseProtectWindows>
ExcelWorkbook>
<Styles>