StringTemplate实现Excel导出

StringTemplate模板实现Excel文件导出

在工作中有时会遇到百万级数据导出的场景, 使用poijxls存在大量的节点对象操作, 经常会面临以下问题:

  • 服务器内存溢出;
  • 一次从数据库查询出几百万数据, 查询缓慢.

那么有什么解决方案呢?

可以使用XML格式利用模板填充技术, 分页查询出数据从磁盘写入XML, 最终以Excel多sheet形式生成. 模板技术有FreeMarker, Velocity, StringTemplate等.

本篇我将采用StringTemplate模板技术对XML格式模板进行数据填充操作, 底层原理返璞归真, 用的是基础IO流实现. 同样的, 本篇我会记录自己学习过程中采用反射技术封装的工具方法 . 简单的入门案例我这就不详细写了, 可以参考以下博客:

Java实现大批量数据导入导出(百万以上)-导出

Java 使用stringTemplate导出大批量数据excel(百万级)

1. 导入依赖

<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>

2. 创建XML格式模板

既然是模板填充技术, 那就需要准备被填充的数据模板文件, 创建方式:

(1) 打开Excel, 创建一个Sheet表, 设置好自己需要的标题行和单元格样式;

(2) 另存为, 选择以xml表格方式保存.

(3) 然后用notepad++等记事本打开xml模板文件, 提取xml模板头部(head.st), 数据体部分(body.st)和尾部(foot.st).

StringTemplate实现Excel导出_第1张图片

2.1 数据模板一

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>