【发布时间】:2017-03-02 23:59:22
【问题描述】:
像这样使用 NPOI:
static void xlsx()
{
XSSFWorkbook xsswb;
using (FileStream file = new FileStream(@"test.xlsx", FileMode.Open, FileAccess.Read))
{
xsswb = new XSSFWorkbook(file);
}
ISheet sheet = xsswb.GetSheet("SheetOne");
for (int row = 0; row <= 200; row++)
{
if (sheet.GetRow(row) != null) //null is when the row only contains empty cells
{
for (var cell = 0; cell < 11; cell++)
{
var cellvalue = sheet.GetRow(row).GetCell(cell);
if (cellvalue != null)
{
Console.WriteLine(string.Format("Row {0} {1} = {2}", row, cell, cellvalue.ToString()));
}
else
{
Console.WriteLine("null");
}
}
}
}
}
在一个特定的非空工作簿上,我没有在控制台上写入结果:返回的每一行都是空的。
如果我创建一个新的 xlsx,填充它,然后用这段代码打开它,一切正常。其他xlsx开得很好。问题必须与我必须导入的 xlsx 的特定格式有关。 (我不能在这里分享,因为它包含保留信息)
如果我用 Excel 打开 test.xslx 文件,另存为,xlsx 文件,上面的代码运行良好。 (文件大小从37kb增长到69kb)
如果我在 test.xls 中重命名 test.xlsx 并使用 HSSFWorkbook,NPOI 正确地抱怨该文件确实是 2007+ excel 文件,我应该改用 XSSFWorkBook。
我无法更改源 excel 文件,因为它是由工具生成的,我的用户应该在没有任何修改的情况下使用它。
有什么想法吗? 谢谢。
【问题讨论】:
-
您遇到问题的工作簿是否实际上有一个名为“SheetOne”的工作表?如果它有不同的名称,例如“Sheet1”,那么您的循环将不会运行。
-
@BrianRogers 实际上它会在
sheet.GetRow(row)产生一个异常,因为工作表为空。 -
@pomarc 您的代码应该可以工作。 “在特定的非空工作簿上” 是什么意思?您创建的 excel 文件与您正在谈论的工具生成的源 excel 之间有什么区别?
-
@krlzlx 是的,这就是我的意思。抱歉,措辞不佳的评论。
-
何布赖恩,当然有那张纸。事实上,如果它没有,它就会成为一个例外。我从 SAP 中提取了另一个 excel,它只能读取到第 5 行,然后所有后续行都显示为空,即使有数据。我找不到在 NPOI 和 excelreader 中导入它的方法,但我成功使用了 EPPLUS。可能 SAP 创建的文件中有一些错误,有些读者会忽略,有些则不会。