2014-10-11 260 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