当前位置: 首页 > 知识库问答 >
问题:

如何使用POI读取和编辑巨大的excel文件?

娄建义
2023-03-14

我需要做以下工作

1) 复制一个巨大的excel文件1400*1400并复制一份。

2)读取复制的文件并添加新的列和行,并同时进行编辑。

3) 这将是一个独立的程序,而不是在服务器上。我有低内存占用和快速性能的限制。

我做了一些阅读,发现以下内容

1)没有 API 可以复制一个巨大的文件

2)SXSSF可以用于写,但不能用于读

3)XSSF和SAX(事件API)可以用于读取,但不能用于editing.If我尝试再次读取并存储为对象,我将遇到内存问题。

你能帮我怎么做吗?

共有3个答案

彭宏阔
2023-03-14

如果内存是处理您指出的记录数(即1400*1400)的问题,那么获取XML数据并处理这些数据可能是您的解决方案。我知道这可能不是最好的解决方案,但它肯定能满足您的低内存需求。甚至POI站点也指出了这个解决方案:

“如果内存占用是一个问题,那么对于XSSF,您可以获取底层XML数据,并自己处理它。这是为愿意学习一点. xlsx文件的低级结构,并且乐于在java中处理XML的中级开发人员设计的。它使用起来相对简单,但需要对文件结构有基本的了解。提供的优势是您可以用相对较小的内存占用读取XLSX文件。”

来源:艾派克.html

曹骞仕
2023-03-14

如果有很多数据导致内存不足或超出了GC限制,如果内存有问题,可以先将数据解析为xml文件。可以将excel表替换为xml文件,这样内存使用量就会最小。

在 Excel 中,工作表表示为 xml。使用 java.util.zip..可以识别每个条目。工作表的xml可以替换为解析的xml,以便我们在Excel工作表中获取预期的数据。

以下类可用于创建 xml 文件:

public class XmlSpreadsheetWriter {
    private final Writer _out;
    private int _rownum;

    public XmlSpreadsheetWriter(Writer out){
        _out = out;
    }

    public void beginSheet() throws IOException {
        _out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">" );
        _out.write("<sheetData>\n");
    }

    public void endSheet() throws IOException {
        _out.write("</sheetData>");
        _out.write("</worksheet>");
    }

    public void insertRow(int rownum) throws IOException {
        _out.write("<row r=\""+(rownum+1)+"\">\n");
        this._rownum = rownum;
    }

    public void endRow() throws IOException {
        _out.write("</row>\n");
    }

    public void createCell(int columnIndex, String value, int styleIndex) throws IOException {
     String ref = new CellReference(_rownum, columnIndex).formatAsString();
     _out.write("<c r=\""+ref+"\" t=\"inlineStr\"");
     _out.write(" s=\""+styleIndex+"\"");
     _out.write(">");
     _out.write("<is><t>"+value+"</t></is>");
     _out.write("</c>");
    }

    public void createCell(int columnIndex, double value, int styleIndex) throws IOException {
     String ref = new CellReference(_rownum, columnIndex).formatAsString();
     _out.write("<c r=\""+ref+"\" t=\"n\"");
     _out.write(" s=\""+styleIndex+"\"");
     _out.write(">");
     _out.write("<v>"+value+"</v>");
     _out.write("</c>");
    }

    public void createEmptyCell(int columnIndex, int styleIndex)throws IOException {
     String ref = new CellReference(_rownum, columnIndex).formatAsString();
     _out.write("<c r=\""+ref+"\" t=\"n\"");
     _out.write(" s=\""+styleIndex+"\"");
     _out.write(">");
     _out.write("<v></v>");
     _out.write("</c>");
    }
} 
壤驷宏才
2023-03-14

假设您的内存大小足够大,可以使用XSSF/SAX进行读取,使用SXSSF进行写入,让我建议以下解决方案。

1) 使用 XSSF/萨克斯读取文件。对于每一行,使用行数据创建一个对象,并使用 ObjectOutputStream 或您认为方便的任何其他输出格式立即将其写出到文件中。您将为每行创建一个单独的文件。内存中将只有 1 行对象,因为您可以使用每行的数据不断修改相同的对象。

2)进行任何您需要的修改。对于需要修改的行,请将相应的文件读回行对象,根据需要进行修改,然后将其写回。对于新行,只需在行对象中设置数据并将其写出到新文件中即可。

3) 使用SXSSF一次读取一行对象文件并将其存储在输出电子表格中,从而重新组装电子表格。

这样,你一次只有一行内存。

 类似资料:
  • 我正在尝试读取一个大的XLSX文件。Excel文件大约有500k行,我需要读col 2。 它一直打印到第39723行,然后抛出以下异常 main.java:484=If(!cell.getStringCellValue().ToString().trim().IsEmpty())如果我删除该行并只打印行号,就可以正常工作。我需要帮助如何获得col2的字符串值。

  • 问题内容: 输入文件包含数千个XML格式的事务,大小约为10GB。要求是根据用户输入选择每个事务XML,并将其发送到处理系统。 文件的样本内容 希望(技术)用户提供输入标签名称,例如。 我们希望提供更通用的解决方案。文件内容可能会有所不同,用户可以使用XPath表达式(例如“ ”)来选择单个事务。 这里我们需要考虑的技术问题很少 该文件可以位于共享位置或FTP 由于文件很大,因此我们无法在JVM中

  • 我正在尝试使用Apache POI编辑包含数据的excel文件。我编写了以下代码: 当我运行代码时,当我尝试打开Excel文件时,会出现以下错误:“我们发现‘file.xlsx’中的某些内容有问题。您希望我们尽可能多地恢复吗?如果您信任此工作簿的来源,请单击是。” 如果我单击是,Excel确实会使用我指定的值进行更新;但是,我不希望出现此错误。我如何解决这个问题?

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离

  • 问题内容: 我有一个很大的csv文件,因此无法将它们全部读入内存。我只想阅读和处理其中的几行内容。所以我正在Pandas中寻找一个可以处理此任务的函数,基本的python可以很好地处理此任务: 但是,如果我在熊猫中这样做,我总是会读第一行: 我正在寻找一些更简单的方法来处理熊猫中的这项任务。例如,如果我想读取1000到2000的行。如何快速执行此操作? 我想使用熊猫,因为我想将数据读入数据框。 问

  • 我正在写一些代码导入Excel文件到数据库。文件可能很大(数千行),所以我使用事件API。POI版本为3.9 我这样打开文件:FileInputStream fin=new FileInputStream(file); 有些文件在最后一行引发FileNotFoundException。的确,如果我用7zip打开那些文件,就没有条目,而是有。 可以在Excel2007中成功打开相同的文件。当我用手动