聊聊Excel解析:如何处理百万行EXCEL文件?

作者 | 京东云开发者-京东保险 孙昊语
一、引言
Excel 表格在后台管理系统中使用非常广泛,多用来进行批量配置、数据导出工作 。在日常开发中,我们也免不了进行 Excel 数据处理 。
那么,如何恰当地处理数据量庞大的 Excel 文件,避免内存溢出问题?本文将对比分析业界主流的 Excel 解析技术,并给出解决方案 。
如果这是您第一次接触 Excel 解析,建议您从第二章了解本文基础概念;如果您已经对 POI 有所了解,请跳转第三章阅读本文重点内容 。
二、基础篇 - POI
说到 Excel 读写,就离不开这个圈子的的老大哥 ——POI 。

聊聊Excel解析:如何处理百万行EXCEL文件?

文章插图
Apache POI 是一款 Apache 软件基金会用 JAVA 编写的免费开源的跨平台的 Java API,全称 Poor Obfuscation Implementation,“简洁版的模糊实现” 。它支持我们用 Java 语言和包括 word、Excel、PowerPoint、Visio 在内的所有 Microsoft office 文档交互,进行数据读写和修改操作 。
(1)“糟糕” 的电子表格
在 POI 中,每种文档都有一个与之对应的文档格式,如 97-2003 版本的 Excel 文件(.xls),文档格式为 HSSF——Horrible SpreadSheet Format,意为 “糟糕的电子表格格式” 。虽然 Apache 幽默而谦虚地将自己的 API 冠以 “糟糕” 之名,不过这确实是一款全面而强大的 API 。
以下是部分 “糟糕” 的 POI 文档格式,包括 Excel、Word 等:
Office 文档对应 POI 格式Excel (.xls)HSSF (Horrible SpreadSheet Format)Word (.doc)HWPF (Horrible Word Processor Format)Visio (.vsd)HDGF (Horrible DiaGram Format)PowerPoint(.ppt)HSLF(Horrible Slide Layout Format) (2)OOXML 简介微软在 Office 2007 版本推出了基于 XML 的技术规范:Office Open XML,简称 OOXML 。不同于老版本的二进制存储,在新规范下,所有 Office 文档都使用了 XML 格式书写,并使用 ZIP 格式进行压缩存储,大大提升了规范性,也提高了压缩率,缩小了文件体积,同时支持向后兼容 。简单来说,OOXML 定义了如何用一系列的 XML 文件来表示 Office 文档 。
Xlsx 文件的本质是 XML
让我们看看一个采用 OOML 标准的 Xlsx 文件的构成 。我们右键点击一个 Xlsx 文件,可以发现它可以被 ZIP 解压工具解压(或直接修改扩展名为.zip 后解压),这说明: Xlsx 文件是用 ZIP 格式压缩的 。解压后,可以看到如下目录格式:
聊聊Excel解析:如何处理百万行EXCEL文件?

文章插图
打开其中的 “/xl” 目录,这是这个 Excel 的主要结构信息:
聊聊Excel解析:如何处理百万行EXCEL文件?

文章插图
其中 workbook.xml 存储了整个 Excel 工作簿的结构,包含了几张 sheet 表单,而每张表单结构存储在 /wooksheets 文件夹中 。styles.xml 存放单元格的格式信息,/theme 文件夹存放一些预定义的字体、颜色等数据 。为了减少压缩体积,表单中所有的字符数据被统一存放在 sharedStrings.xml 中 。经过分析不难发现, Xlsx 文件的主体数据都以 XML 格式书写 。
XSSF 格式
为了支持新标准的 Office 文档,POI 也推出了一套兼容 OOXML 标准的 API,称作 poi-ooxml 。如 Excel 2007 文件(.xlsx)对应的 POI 文档格式为 XSSF(XML SpreadSheet Format) 。
以下是部分 OOXML 文档格式:
Office 文档对应 POI 格式Excel (.xlsx)XSSF (XML SpreadSheet Format)Word (.docx)XWPF (XML Word Processor Format)Visio (.vsdx)XDGF (XML DiaGram Format)PowerPoint (.pptx)XSLF (XML Slide Layout Format) (3)UserModel在 POI 中为我们提供了两种解析 Excel 的模型, UserModel(用户模型)和 EventModel(事件模型) 。两种解析模式都可以处理 Excel 文件,但解析方式、处理效率、内存占用量都不尽相同 。最简单和实用的当属 UserModel 。
UserModel & DOM 解析
用户模型定义了如下接口:
  1. Workbook - 工作簿,对应一个 Excel 文档 。根据版本不同,有 HSSFWorkbook、XSSFWorkbook 等类 。
  2. Sheet - 表单,一个 Excel 中的若干个表单,同样有 HSSFSheet、XSSFSheet 等类 。
  3. Row - 行,一个表单由若干行组成,同样有 HSSFRow、XSSFRow 等类 。
  4. Cell - 单元格,一个行由若干单元格组成,同样有 HSSFCell、XSSFCell 等类 。

聊聊Excel解析:如何处理百万行EXCEL文件?

文章插图
可以看到,用户模型十分贴合 Excel 用户的习惯,易于理解,就像我们打开一个 Excel 表格一样 。同时用户模型提供了丰富的 API,可以支持我们完成和 Excel 中一样的操作,如创建表单、创建行、获取表的行数、获取行的列数、读写单元格的值等 。


推荐阅读