将XLS转换为XLSX的NPOI抛出空引用

本文关键字:引用 NPOI XLS 转换 XLSX | 更新日期: 2023-09-27 18:10:56

我正在尝试使用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构造函数的CT_Cell,从我可以在npoi代码中读取。

有没有其他人尝试过这样做和/或已经修复了它?

谢谢。

将XLS转换为XLSX的NPOI抛出空引用

看起来您必须显式调用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;
    }