我有一个要求做到以下几点
1)复制一个巨大的Excel文件1400 * 1400,并进行复印。
2)读取复制文件,并添加新的行和列,并在同一时间进行编辑。
3)这将是一个独立的程序,而不是在服务器上。 我有低内存占用和快速的性能的限制。
我已经做了一些阅读和发现以下
1)没有API复制sucg一个巨大的文件
2)SXSSF可以使用书写而不是阅读
3)XSSF和SAX(事件API)可以使用阅读,但不是editing.If我试图读取和存储为对象再次我将有一个内存问题。
请你能对我怎么能做到这一点帮助?
假设你的内存大小足够大,可以使用XSSF / SAX读取和SXSSF写,让我提出以下解决方案。
1)使用读XSSF / SAX该文件。 对于每一行,创建与该行数据的对象,并立即写出到使用ObjectOutputStream或您方便的任何其它输出格式的文件。 您将创建每一行一个单独的文件。 而且只会出现在内存1个对象,因为你可以不断修改,每行的数据相同的对象。
2)请您需要任何修改。 对于需要修改的行,读取相应的文件返回到你的行对象,根据需要进行修改,并将其写回。 对于新行,只需在您的行对象设定的数据并写入到一个新文件。
3)使用SXSSF通过读取1行对象文件的时间和它存储在输出电子表格重新组合您的电子表格。
这样一来,您只能在一个时间内存1行。
如果有很多数据,由于到“内存不足”或“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>");
}
}
如果内存是处理的记录你所指出的数量(即1400 * 1400),然后让XML数据和处理这些可能是你的解决方案的问题。 我知道这可能不是最好的解决方案,但它会为确保解决您有低内存要求。 即使POI网站点这个解决方案太:
“如果内存占用的问题,那么对于XSSF,你可以在底层的XML数据得到的,和你自己处理它。这是为中级开发商谁愿意学习的.xlsx文件低水平结构的一点点,和谁是Java幸福处理XML,它的使用比较简单,但需要的文件结构的一个基本的了解。所提供的好处是,你可以阅读XLSX具有相对小的内存占用文件“。
来源: http://poi.apache.org/spreadsheet/how-to.html