2015-09-01 47 views
0

我試圖將文件從XLS轉換爲使用NPOI的XLSX。由於我不知道一個明確的轉換,我寫了這第一個實現通過行和單元格和複製會從一個到另一個:NPOI將XLS轉換爲XLSX引用空引用

public string ConvertToXlsx(string xlsPath) 
    { 
     var oldWorkbook = new HSSFWorkbook(new FileStream(xlsPath, FileMode.Open)); 
     var oldWorkSheet = oldWorkbook.GetSheetAt(0); 
     var newExcelPath = xlsPath.Replace("xls", "xlsx"); 
     using (var fileStream = new FileStream(newExcelPath, FileMode.Create)) 
     { 
      var newWorkBook = new XSSFWorkbook(); 
      var newWorkSheet = new XSSFSheet(); 
      newWorkBook.Add(newWorkSheet); 

      foreach (HSSFRow oldRow in oldWorkSheet) 
      { 
       var newRow = newWorkSheet.CreateRow(oldRow.RowNum); 

       for (int ii = oldRow.FirstCellNum; ii < oldRow.LastCellNum; ii++) 
       { 
        var newCell = newRow.CreateCell(ii); 
        newCell = oldRow.Cells[ii]; 
       } 
      } 

      newWorkBook.Write(fileStream); 
     } 

     return newExcelPath; 
    } 

然而,上線var newCell = newRow.CreateCell(ii); NPOI拋出一個NullReferenceException以下堆棧跟蹤:

at NPOI.XSSF.UserModel.XSSFCell..ctor(XSSFRow row, CT_Cell cell) 
at NPOI.XSSF.UserModel.XSSFRow.CreateCell(Int32 columnIndex, CellType type) 
at NPOI.XSSF.UserModel.XSSFRow.CreateCell(Int32 columnIndex) 
at Ing2Ynab.Excel.IngExcelConverter.ConvertToXlsx(String xlsPath) 

,我不知道爲什麼它的發生,如XSSFRow應該負責創建被轉嫁到XSSFCell構造,從我能在NPOIs代碼讀取CT_Cell的。

有沒有其他人試圖做到這一點和/或已修復它?

謝謝。

回答

1

看起來您必須顯式調用Workbooks CreateSheet()方法,而不是調用.Add()。此外,您似乎在循環中有一些超出範圍的例外情況,請注意這一點。

public string ConvertToXlsx(string xlsPath) 
    { 
     var oldWorkbook = new HSSFWorkbook(new FileStream(xlsPath, FileMode.Open)); 
     var oldWorkSheet = oldWorkbook.GetSheetAt(0); 
     var newExcelPath = xlsPath.Replace("xls", "xlsx"); 
     using (var fileStream = new FileStream(newExcelPath, FileMode.Create)) 
     { 
      var newWorkBook = new XSSFWorkbook(); 
      var newWorkSheet = newWorkBook.CreateSheet("Sheet1"); 

      foreach (HSSFRow oldRow in oldWorkSheet) 
      { 
       var newRow = newWorkSheet.CreateRow(oldRow.RowNum); 

       for (int ii = oldRow.FirstCellNum; ii < oldRow.LastCellNum; ii++) 
       { 
        var newCell = newRow.CreateCell(ii); 
        newCell = oldRow.Cells[ii]; 
       } 
      } 

      newWorkBook.Write(fileStream); 
     } 

     return newExcelPath; 
    } 
+0

而不是oldRow.LastCellNum,也許使用oldRow.Cells.Count –

相關問題