2016-12-27 969 views
0

我是NPOI的新手,我有一個問題,我無法找到「簡單」的答案/解決方案。 (我不想關閉並打開一個文件5次。)如何使用NPOI多次保存XLS文件(每次修改後一次)

我需要編輯一個XLS文件,(假設我想修改5個單元格,從0到1),但我必須保存文件每次修改後(意思是5次)。

我注意到第一個更改被保存了,但是當我打開xls文件時我看不到剩下的修改。我注意到文件的大小是5 *(首次更改時的文件大小)。

我的代碼是這樣的:

public void SetCell(int row, int col, CellData xlsCell) 
{ 
    ISheet sheet = mXLSWorkBooK.GetSheet(("mySheet1")); 
    sheet.SetActive(true); 

    ICell cell; 
    cell = sheet.CreateRow(row).CreateCell(col); 
    cell.SetCellType(CellType.String); 
    cell.SetCellValue(xlsCell.Text); 

    mXLSWorkBooK.Write(mfile); 
    mfile.Flush(); 
} 

,我調用此方法的5倍。

回答

0

您可能會誤解IWorkbook.Write(stream)的工作原理。此方法不寫出增量更改;它總是寫出整個工作簿。如果您每次都重複使用現有的流(這看起來像是在做什麼),那麼您將將整個工作簿內容追加到流的末尾,從而創建損壞的文件。 (這也解釋了爲什麼文件每次寫入時都會增大)。這不是NPOI的預期使用模式。相反,您應該每次使用一個新的流並寫入該流,覆蓋該文件。我會建議做一個輔助方法是這樣的:

public static void SaveWorkbook(IWorkbook wb, string fileName) 
{ 
    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
    { 
     wb.Write(fs); 
    } 
} 

然後調用helper方法,當您需要保存文件。

0

感謝您的重播。 我發現我的錯誤!

當我使用cell = sheet.CreateRow(row).CreateCell(col)時,對於當前行中的'next'單元格,我實際上刪除了該行並僅從新創建了它,因此最終狀態是每行中的單個單元格。