由于你处理的excel文件很大,我建议你使用XSSF + SAX的方法。
使用这种方法,您可以流式传输将数据存储在 excel 文件中的 XML 文件。
您可以从 SAX 解析器生成的事件中捕获数据。将搜索数据与每一行进行比较。
对于每次搜索,您都必须流式传输整个 XML,但这确实很快。
------------已编辑----------------------------------
详细一点,
将 .xlsx 文件重命名为 .zip。它会给你一个 zip 文件。打开它,您将看到一个名为“xl”的文件夹。在“xl”文件夹内集中处理以下内容。
worksheets 文件夹: 包含每个工作表的 xml 表示。
sharedStrings.xml : 用于跨工作表存储所有字符串值的公共位置。
styles.xml : 用于保存应用于单元格的样式(颜色、公式...)的公共位置。
workbook.xml : 包含 .xlsx 文件中所有工作表的信息
现在从 workbook.xm 开始。在此文件中,所有工作表都包含在标签中。
工作表表示为<sheet> 例如:<sheet name="General" sheetId="15" r:id="rId1"/>
以 r:id 为例,它将帮助您访问代表 .xlsx 文件的 General 表的 General.xml。
一旦您拥有 r:id,http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api 将帮助您读取 XML 文件并获取其内容。
OPCPackage pkg = OPCPackage.open(filename); //opens the .xlsx file
XSSFReader r = new XSSFReader( pkg ); //reads the xml fiels indide the .xlsx file
XMLReader parser = fetchSheetParser(sst); //SAX parser for parsing the XML files.
使用 XSSFReader 为解析器提供 XMl 读取,编写一个实现 DefaultHandler 接口的事件处理程序来捕获 XMLReader 生成的事件。
SharedStringsTable sharedStringsTable = reader.getSharedStringsTable(); // using this we can access sharedStrings.xml
StylesTable stylesTable = reader.getStylesTable(); // using this we can access styles.xml
Since we are streaming the XML, we dont have to worry about memory consumption.