Java使用Apache POI读取Excel数据

需积分: 3 3 下载量 151 浏览量 更新于2024-09-14 收藏 23KB DOC 举报
"Java 使用Apache POI库读取Excel文件" 在Java开发中,处理Excel文件是一项常见的任务,Apache POI是一个流行的库,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xlsx)文件。在这个场景中,我们看到的是使用Apache POI的事件模型(Event API)来读取Excel文件,这种方法对于处理大型Excel文件非常有效,因为它不需要将整个文件加载到内存中。 `ExcelUtil` 类继承自 `DefaultHandler`,这是一个SAX解析器的回调接口,用于处理解析XML时触发的事件。SAX解析器是一种基于事件驱动的解析方式,它逐个处理XML文档的元素,而不是一次性加载整个文档。 首先,我们需要打开并加载Excel文件。这通过 `OPCPackage.open(path)` 实现,`OPCPackage` 是用来处理Open Packaging Conventions (OPC) 包的类,Excel的.xlsx文件就是使用OPC格式存储的。 接着,`XSSFReader` 用于读取Excel文件中的数据。`XSSFReader r = new XSSFReader(pkg);` 创建了一个新的XSSFReader实例,它可以从OPCPackage对象中获取数据。通过 `r.getSharedStringsTable();` 我们可以获取到共享字符串表,这是Excel文件中存储所有文本字符串的地方,以便重复使用相同的字符串时节省空间。 然后,我们创建一个XMLReader对象,它是SAX解析器的实现,用于解析Excel的工作表部分。`XMLReader parser = XMLReaderFactory.createXMLReader();` 初始化这个解析器,并设置 `ExcelUtil` 作为它的处理器。 在 `ExcelUtil` 类中,我们定义了一些内部变量,如 `SharedStringsTable sst` 用于存储共享字符串,`lastContents` 用于存储当前单元格的内容,`nextIsString` 用于判断下一个事件是否是字符串,`sheetIndex` 用于跟踪当前工作表的索引,`rowlist` 存储每一行的数据,`curRow` 和 `curCol` 分别记录当前处理的行和列。 在 `readOneSheet` 方法中,我们调用了 `parser.parse(new InputSource(is));` 来启动解析过程,`is` 是从XSSFReader获取的输入流。在解析过程中,SAX解析器会调用 `DefaultHandler` 的方法,如 `startElement`,`endElement` 和 `characters`,我们可以在这些方法中处理Excel文件的内容。 例如,当遇到一个新的单元格元素时,我们可能需要检查是否有共享字符串,如果是,就从共享字符串表中获取实际的文本。通过这种方式,我们可以逐个处理Excel文件中的每个单元格,而不需要一次性加载整个文件到内存。 这段代码展示了如何利用Java和Apache POI库以低内存消耗的方式读取Excel文件,这对于处理大型或内存受限的环境下的Excel文件特别有用。