2012-01-21 46 views
1

我用在線code的一個簡單的代碼,我能夠在for循環中的代碼中調用該方法並傳遞它的數據和行號。該文件已正確創建,文件的大小(在刷新我的文件資源管理器後)會在每次插入時發生更改,但是當我完成後,我打開文件,我只能看到第一行,然後關閉它的大小文件從1.5MB減少到5個字節。我在notepad ++中打開了1.5 MB文件(當然,它是用字節字符打開的)我實際上可以看到除第一行以外我已寫入文件的數據,所有的行都在那裏。但是當我在Excel中打開它並沒有。由poi API創建的Excel文件:數據在那裏,但只有一行是可見的?

有沒有我在這裏失蹤的東西。在每次插入Excel文件我這樣做:

fileOutputStream = new FileOutputStream(fileName,true); 
sampleWorkbook.write(fileOutputStream); 

,之後在try塊的finally塊:

finally { 
    /** 
    * Close the fileOutputStream. 
    */ 
    try { 
     if (fileOutputStream != null) { 
      fileOutputStream.flush(); 
      fileOutputStream.close(); 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

但如果文件大小在變化,我可以查看記事本中的數據爲什麼excel會將除第一個以外的行作爲臨時數據處理(這正是我所假設的,因爲它在關閉文件時只恢復爲5個字節)?這裏有什麼問題?

感謝您的幫助,提前。

syed。

+1

關於您的'finally {...}塊的小樣式註釋:無需調用'flush()',它在'close()'過程中被調用。另外,如果你使用Java 7,你可以在這個塊流自動關閉之後寫'try(FileOutputStream fos = new FileOutputStream(fileName,true)){/ * code here * /}'。 –

+0

@FrozenSpider:不錯...我知道Java 7很酷(因爲Java 6開發人員實際上可以使用kewl for java大聲笑..),但我們仍然在6。願意在7日工作。 – sarmahdi

回答

2

這裏的問題是,xls不是一個簡單的格式,向xls添加一行並不意味着在文件末尾添加幾個字節。新數據插入到文件的中間,因此您必須完全重寫整個文件。 您的代碼示例只是在已有的工作簿之後寫入另一個工作簿,這會使文件內容無效。因此,當您在Excel中打開它時,它會自動更正文件內容,刪除第一個工作簿以外的所有添加的數據。

使用此代碼示例:

InputStream in = new FileInputStream (path); 
Workbook sampleWorkbook; 
try{ 
    sampleWorkbook = new HSSFWorkbook (in);//or XSSFWorkbook depending on whether you use xls or xlsx 
} finally 
{ 
    in.close(); 
} 

//Add some rows into the workbook 

OutputStream out = new FileOutputStream (path); 
try{ 
    sampleWorkbook.write (out); 
} finally 
{ 
    out.close(); 
} 
+0

所以,如果我正在做一個新的文件寫只是FileOutPutStream wud已經足夠,但是當我需要添加數據到excel文件我需要得到一個FileInputStream,然後從那裏添加它,然後創建一個新的outputStream爲同一個文件並重新寫入整個工作簿的文件。謝謝 – sarmahdi

+0

我試過你的代碼,它工作正常:但在一些插入(或最特別是在新的HSSFWORKBOOK(新fileinputstream(文件名)))它給出了一個例外:org.apache .poi.hssf.record.RecordInputStream $ Lef toverDataException:記錄0x3C的初始化剩下5414字節仍有待讀取。有沒有我想念的東西:我是usign poi-3.6-20091214.jar。除此之外,我的最後一條記錄從來沒有寫過,就像我正在連續寫入4個字符串一樣,我的第四個單元格正在寫入watever數據中。 – sarmahdi

+0

這可能是ebcuase的數據可能有一些阿拉伯字符?嗯,這是同樣的問題,或者我應該在這個問題上發佈一個新的... – sarmahdi

0

可能未在有關你的問題,但容易產生的Excel,建議使用JXLS(http://jxls.sourceforge.net/)這是建在POI之上。 JXLS的美麗部分是它使您能夠創建Excel模板(當然使用Excel),然後您只需將數據放入模板。它支持基本的邏輯運算,包括else和loop。

+0

你有一個教程或一個例子,我可以看看...源頁面只是定義 – sarmahdi

+0

檢查樣本在http://jxls.sourceforge.net/ –

+0

這是一件很酷的事情:讓你移動你從Java進入模板。雖然我不認爲它允許您從文件中打開工作簿,但可以對其進行編輯,然後保存或通過模板更新工作簿。 –

0

如果您負擔得起商業解決方案,請查看Templater。它非常易於使用。免責聲明:我是作者。

相關問題