对于具有行的 sheet,FirstRowNum 和 LastRowNum 返回 -1 的 NPOI 问题

NPOI issue with FirstRowNum and LastRowNum returning -1 for a sheet that has rows

当尝试使用 NPOI、FirstRowNum 和 LastRowNum return -1.

从 Excel sheet 中获取行时
IWorkbook workbook = null;
List<ImportedKPI> excelRows = new List<ImportedKPI>();
MemoryStream ms = new MemoryStream(array);
ISheet sheet = null;

workbook = WorkbookFactory.Create(ms);

sheet = workbook.GetSheet(mapping.Sheet);

//Do some stuff here and try to get rows  
for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++)
    //sheet.FirstRowNum = -1 && sheet.LastRowNum = -1

另一个值得一提的是,当我保存打开文件并关闭它(使用 LibreOffice)时,它会询问我是否要保存,然后它就可以工作了。 比较字节数组时 before/after 保存它们是不同的。

事实证明并非所有 excel 解析器都适用于所有类型。 由于我通过电子邮件收到 excels,因此我必须基于 NPOI 和 ExcelDataReader nugets 执行责任链模式。 这意味着当 excel 出现时,我尝试使用第一个 class 来解析它(首先是 ExcelDataReader),如果它不成功,它会继续使用 NPOI 并尝试用它来解析它。 当有很多来源时,这似乎是更好的方法。