POI
想到数据的导入导出,大部分人最会想到apache的poi框架 以及Excel的版本问题。
POI 是 Apache 的一个开源项目,全称是 Poor Obfuscation Implementation,它是 Java 语言对 Microsoft Office 文档格式的操作工具。
主要功能包括:
- 提供对 Excel 电子表格的读写支持,可以读取和修改 Excel 的数据、样式等内容。
- 提供对 Word 文档的读写支持,可以读取和修改 Word 文档的文本、样式、列表等内容。
- 提供对 PowerPoint 演示文稿的读写支持,可以读取和修改 PPT 的文本、表格、图片等内容。
- 提供对 Outlook 电子邮件的支持,可以创建和修改 Outlook 邮件文件。
- 支持其他 Microsoft Office 文件格式,如 Visio、Publisher 等。
POI 的主要优点:
使用 Java 语言开发,跨平台运行于 Windows、Linux、Unix 等系统。
提供了易于使用的 API,可以用 Java 代码方便地处理 Office 文档。
成熟稳定,拥有大量用户群,社区活跃。
免费开源,代码托管在 Apache。
总之,POI 是操作 Office 文档的好工具,适合在需要编程处理 Excel、Word、PPT 等 Office 文档的场景下使用
POI不同版本的实现
HSSFWorkbook
早期使用最多的对象,它可以操作Excel2003以前(包含2003)的所有Excel版本。
在2003以前Excel的版本后缀还是.xls
XSSFWorkbook
操作的Excel2003–Excel2007之间的版本,Excel的扩展名是.xlsx
SXSSFWorkbook
POI3.8之后的版本才有的,它可以操作Excel2007以后的所有版本Excel,扩展名是.xlsx
不同API实现的优缺点
HSSFWorkbook
它是POI版本中最常用的方式
缺点
- 最多只能导出 65535行,也就是导出的数据函数超过这个数据就会报错;
优点
- 一般不会报内存溢出。(因为数据量还不到7w所以内存一般都够用, 是将数据先读取到内存中,然后再操作)
XSSFWorkbook
优点
这种形式的出现是为了突破HSSFWorkbook的65535行局限,是为了针对Excel2007版本的1048576行,16384列,最多可以导出104w条数据;
缺点
虽然导出数据行数增加了好多倍,但是随之而来的内存溢出问题也更加突出。因为所创建的book,Sheet,row,cell等在写入到Excel之前,都是存放在内存中的
SXSSFWorkbook
从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的SXSSF方式:
优点:
- 一般不会出现内存溢出(它使用了硬盘来换取内存空间,当内存中数据达到一定程度这些数据会被持久化到硬盘中存储起来,而内存中存的都是最新的数据),
- 支持大型Excel文件的创建(存储百万条数据轻轻松松)
缺点:
既然一部分数据持久化到了硬盘中,且不能被查看和访问那么就会导致,在同一时间点我们只能访问一定数量的数据,也就是内存中存储的数据;
sheet.clone()方法将不再支持,还是因为持久化的原因;
不再支持对公式的求值,还是因为持久化的原因,在硬盘中的数据没法读取到内存中进行计算;
在使用模板方式下载数据的时候,不能改动表头,还是因为持久化的问题,写到了硬盘里就不能改变了;
经验
1、当我们经常导入导出的数据不超过7w的情况下,可以使用 HSSFWorkbook 或者 XSSFWorkbook都行;
2、当数据量查过7w并且导出的Excel中不牵扯对Excel的样式,公式,格式等操作的情况下,推荐使用SXSSFWorkbook;
3、当数据量查过7w,并且我们需要操做Excel中的表头,样式,公式等,这时候我们可以使用 XSSFWorkbook 配合进行分批查询,分批写入Excel的方式来做;
百万级别的数据导入导出的方案 EasyExcel
https://github.com/alibaba/easyexcel