如何阅读和使用POI编辑巨大的Excel文件?(How do i read and edit hug

2019-10-18 05:12发布

我有一个要求做到以下几点

1)复制一个巨大的Excel文件1400 * 1400,并进行复印。

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

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

我已经做了一些阅读和发现以下

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

2)SXSSF可以使用书写而不是阅读

3)XSSF和SAX(事件API)可以使用阅读,但不是editing.If我试图读取和存储为对象再次我将有一个内存问题。

请你能对我怎么能做到这一点帮助?

Answer 1:

假设你的内存大小足够大,可以使用XSSF / SAX读取和SXSSF写,让我提出以下解决方案。

1)使用读XSSF / SAX该文件。 对于每一行,创建与该行数据的对象,并立即写出到使用ObjectOutputStream或您方便的任何其它输出格式的文件。 您将创建每一行一个单独的文件。 而且只会出现在内存1个对象,因为你可以不断修改,每行的数据相同的对象。

2)请您需要任何修改。 对于需要修改的行,读取相应的文件返回到你的行对象,根据需要进行修改,并将其写回。 对于新行,只需在您的行对象设定的数据并写入到一个新文件。

3)使用SXSSF通过读取1行对象文件的时间和它存储在输出电子表格重新组合您的电子表格。

这样一来,您只能在一个时间内存1行。



Answer 2:

如果有很多数据,由于到“内存不足”或“GC超限超过”发生,如果记忆是一个问题的数据,可以初步解析到一个XML文件。 的Excel工作表可以用XML文件被替换,使得内存的使用将是最小的。

在Excel中片材被表示为XML。 使用java.util.zip.ZipFile中的每个条目可识别。 对于板材的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>");
    }
} 


Answer 3:

如果内存是处理的记录你所指出的数量(即1400 * 1400),然后让XML数据和处理这些可能是你的解决方案的问题。 我知道这可能不是最好的解决方案,但它会为确保解决您有低内存要求。 即使POI网站点这个解决方案太:

“如果内存占用的问题,那么对于XSSF,你可以在底层的XML数据得到的,和你自己处理它。这是为中级开发商谁愿意学习的.xlsx文件低水平结构的一点点,和谁是Java幸福处理XML,它的使用比较简单,但需要的文件结构的一个基本的了解。所提供的好处是,你可以阅读XLSX具有相对小的内存占用文件“。

来源: http://poi.apache.org/spreadsheet/how-to.html



文章来源: How do i read and edit huge excel files using POI?
标签: apache-poi