【问题标题】:Efficient way to search records from an excel file using Apache-POI使用 Apache-POI 从 excel 文件中搜索记录的有效方法
【发布时间】:2014-07-16 11:19:13
【问题描述】:

我正在创建一个 Web 应用程序,它允许您从 excel 表中搜索一些记录。需要搜索的 Excel 表很大,它有 100k 行和 500 列。

应该使用什么方法?我只是想让用户在这个excel表上执行搜索,所以我应该使用数据库吗(首先我需要在数据库中设置excel表值)?或者还有比这更好的方法吗?

Apache POI 是否提供任何此类直接搜索 excel 文件的方法?

对于这种情况,什么是最有效的方法。将不胜感激提供相应链接的帮助

【问题讨论】:

    标签: java database apache-poi


    【解决方案1】:

    由于你处理的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.
    

    【讨论】:

    • 我很难理解您提供的链接,但无法理解。您能解释一下它是什么以及它如何帮助我进行搜索吗?
    • 我已经编辑过了。请看一下,如果您需要进一步说明,请告诉我。
    • 哦,我知道使用它可以节省一些内存,对吧?即使在较小的内存中,我们也不会出现“内存不足”异常。但是如何更快地搜索记录?如何在此 xml 文件上执行搜索?使用数据库会是一个更好的选择,还是我应该继续搜索这样的 xml 文档?
    • 如果您有时间和内存来读取和存储如此大的 excel 文件,数据库总是一个更好的选择。
    • 时间应该没有那么大的限制吧?我只需要等待第一次,对吧?因为只有第一次它会将这些值输入到数据库中。我们在 Apache POI 中是否有任何直接搜索方法。或者我们需要遍历所有行进行搜索?
    【解决方案2】:

    也许您可以尝试将您的 Excel 电子表格内容导入 MySQL 或 NoSQL(例如 MongoDB)。首先你想把你的 Excel 解析成数据库,然后创建一个查询接口。我想不出查询电子表格的有效方法

    【讨论】:

    • 我只是想让用户在这个excel表上执行搜索,所以我应该使用数据库吗(首先我需要在数据库中设置excel表值)。所以我的问题是可以我有比这更好的方法吗?
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2020-03-21
    相关资源
    最近更新 更多