【问题标题】:NPOI converting XLS to XLSX throwing null referenceNPOI 将 XLS 转换为 XLSX 抛出空引用
【发布时间】:2015-09-01 23:01:57
【问题描述】:

我正在尝试使用 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 代码中可以读到的内容。

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

谢谢。

【问题讨论】:

    标签: c# excel npoi


    【解决方案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;
        }
    

    【讨论】:

    • 而不是 oldRow.LastCellNum,也许使用 oldRow.Cells.Count
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2015-03-27
    • 2013-01-25
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多