2016-08-17 397 views
1

我編寫了以下代碼以使用C#和NPOI庫編輯Excel文件。沒有錯誤,但在運行代碼後,如果我打開文件,單元格的值不會被編輯。我究竟做錯了什麼?嘗試使用NPOI編輯現有Excel文件的單元格值

namespace Project37 
{ 
    class Class1 
    { 
     public static void Main() 
     { 
      string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx"; 

      FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite); 
      HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true); 
      HSSFSheet sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate"); 
      HSSFRow dataRow = (HSSFRow)sheet.GetRow(4); 

      dataRow.GetCell(1).SetCellValue("foo"); 

      MemoryStream ms = new MemoryStream(); 
      templateWorkbook.Write(ms); 
     }  
    } 
} 

回答

1

,你是不是看到的變化,主要的原因是因爲你正在寫的工作簿到MemoryStream,而不是寫回的文件。你應該做的是這樣的:

  1. 使用FileStreamRead模式完全讀取電子表格文件;
  2. 用一種FileStreamWrite模式寫回文件(或選擇寫到不同的文件,如果你不想破壞原有所需的更改,然後
  3. - 這可能是更好的測試)。

還要注意它與實現IDisposable類工作(全部Streams做)時使用using語句很好的做法。這將確保該文件已關閉,並且正確清理了流使用的所有資源。

我在代碼中看到了另一個問題,那就是你顯然試圖使用HSSFWorkbook.xlsx文件。這是行不通的。 HSSFWorkbook(和所有HSSF類)均爲.xls文件。如果您需要使用.xlsx文件,則應該使用XSSFWorkbook和相關的XSSF類。請注意,如果您需要支持這兩種類型的文件,那麼這兩種類別的類都會實現常見接口,如IWorkbook,ISheet,IRow等,以幫助減少代碼重複。我建議儘可能使用它們。但是您可能會發現您仍然需要不時地不斷地訪問某些未被接口覆蓋的功能。

我應該提到另一件事:如果某個特定行x在原始工作簿中不包含單元格,則GetRow(x)將返回空值。同樣,如果單元格y爲空,則GetCell(y)將返回空值。如果您希望能夠設置單元格的值,則需要檢查空值,並酌情使用CreateRow(x)和/或CreateCell(y)以確保每個相應的實體存在。

下面是修改後的代碼:

string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx"; 

IWorkbook templateWorkbook; 
using (FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read)) 
{ 
    templateWorkbook = new XSSFWorkbook(fs); 
} 

string sheetName = "ImportTemplate"; 
ISheet sheet = templateWorkbook.GetSheet(sheetName) ?? templateWorkbook.CreateSheet(sheetName); 
IRow dataRow = sheet.GetRow(4) ?? sheet.CreateRow(4); 
ICell cell = dataRow.GetCell(1) ?? dataRow.CreateCell(1); 
cell.SetCellValue("foo"); 

using (FileStream fs = new FileStream(pathSource, FileMode.Create, FileAccess.Write)) 
{ 
    templateWorkbook.Write(fs); 
} 
+0

顯示如何寫在整個互聯網由NPOI C#中的現有文件的最好的例子。 – Jarkid

相關問題