将XLS转换为XLSX的NPOI引发空引用

我试图使用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应该负责创build传递给XSSFCell构造函数的CT_Cell,这是我可以从NPOIs代码中读到的。

有没有其他人试图做到这一点和/或已经修复了?

谢谢。

看起来像你必须显式调用工作簿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; }