2014-10-11 265 views
1

我使用的是POI的3.10版本。我遇到的问题是我正在创建一个xls,xlsx文件。写入文件时看起来都不错。它大约是2MB。当我在Excel中打开时,它会将文件截断为4K,而我只能得到列标题,所有数据都消失了。如果我试图打开xlsx它说它已损坏。其他人都遇到了这个问题。Excel文件写入后损坏

这是写入数据行的代码。

public void writeRow(int irow, String[] rdata) { 
    Row row; 
    Cell cell; 
    int cellnum = 0; 
    int rownum = irow; 

    System.out.println("writeRow():ROW -> " + irow); 
    row = _wSheet.getRow(irow); 

    if (row == null) { 
     System.out.println("writeRow():Creating Row " + irow); 
     row = _wSheet.createRow(rownum); 
    } 

    for (String rdata1 : rdata) { 
     cell = row.createCell(cellnum++); 
     cell.setCellValue((String) rdata1); 
    } 
    write(); 
} 

public void write() { 
    try { 
     _gWorkbook.write(_outF); 
     _outF.flush(); 
    } catch (IOException wbe) { 
     System.out.println("write(): Error writing workbook "+wbe.getMessage()); 
    } 
} 

回答

3

您似乎在每行写入文件一次,这不是您想要执行的操作。您应该只在最后写完工作簿,完成后

因此,要修复它,请更改您的代码,以便在代码的最后只调用Workbook.write(OutputStream)。不要试图去做,文件格式不能像那样工作

+0

好吧,试试看,得到一个17K文件。但是,当我在Excel中只打开列标题并将文件截断为4k。这之后我按照建议写了一遍毕竟创建的行。我猜你在说什么就是写这本书一次。我做了写入列,写入,然后开始行。所以我现在会回去改变。不知道这将如何处理20MB的数据。感谢Rob – Unixjedi 2014-10-13 19:41:30

+0

您*必须*只写出所有更改的最后,Excel文件格式不起作用。对于非常大的文件,请使用CSV代替(即流),或使用SXSSF(带有强加的限制) – Gagravarr 2014-10-13 20:13:36

+0

谢谢,照顾它。现在XSSF(xlsx)在save.java.lang.NoSuchMethodError上失败:org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold(I)Lorg/apache/xmlbeans/XmlOptions - 使用2.6 XMLBeans – Unixjedi 2014-10-13 22:50:27