每日一博 - Excel导入导出的那点事儿

在这里插入图片描述


POI

想到数据的导入导出,大部分人最会想到apache的poi框架 以及Excel的版本问题。

POI 是 Apache 的一个开源项目,全称是 Poor Obfuscation Implementation,它是 Java 语言对 Microsoft Office 文档格式的操作工具。

主要功能包括:

  1. 提供对 Excel 电子表格的读写支持,可以读取和修改 Excel 的数据、样式等内容。
  2. 提供对 Word 文档的读写支持,可以读取和修改 Word 文档的文本、样式、列表等内容。
  3. 提供对 PowerPoint 演示文稿的读写支持,可以读取和修改 PPT 的文本、表格、图片等内容。
  4. 提供对 Outlook 电子邮件的支持,可以创建和修改 Outlook 邮件文件。
  5. 支持其他 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

扫描二维码关注公众号,回复: 15996674 查看本文章

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


通用导入导出思路

通用导入导出思路

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yangshangwei/article/details/132049348