读取excel null /空白值

时间:2018-02-17 21:49:47

标签: c# excel visual-studio-2017

我正在尝试读取excel null /空白值。 我已经查看了数百个解决方案,要么我实现它错误,要么它似乎不起作用并导致Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'无法对空引用执行运行时绑定'

这是我尝试的最后一个代码之一。(因为我试图将NA放在所有空单元格中)

for (int i = 2; i <= rowCount; i++)
{
    string natext = xlRange.Value2[rowCount, colCount];
    if (natext == null)
    {
        natext = "NA";
    }

任何可以帮助我举一些例子的想法?

  

如果点击它显示的详细信息:   Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
  HResult = 0x80131500 Message =无法对null执行运行时绑定   参考来源=
  StackTrace:

1 个答案:

答案 0 :(得分:1)

首先,Excel对象模型真的很奇怪。 namespace返回export = 0;,该对象可以是各种不同的类型。如果Value2是一个单元格,则它会返回该单元格的值,该值可能是objectxlRange或其他内容。如果string是多个单元格,那么double是一个值数组。然后每个值都是xlRange。对于每个值,您不知道它是object还是object还是其他值。

处理这个问题并不好玩。这实际上非常非常糟糕。 C#是一种强类型语言,这意味着你知道什么类型的东西,你不必猜测。 Excel Interop从你那里拿走了它,然后说:“这是一个对象。它可以是任何东西,也可以是任何东西。可以把它弄清楚。祝你好运。”

不是获取范围的string属性然后循环遍历数组,而是更容易处理范围中的单元格。

鉴于doubleValue2个单元格:

excelRange

这有两件事。首先,你一次看一个单元格。其次,您正在使用Range属性。 for (var row = 1; row <= excelRange.Rows.Count; row++) { for (var column = 1; row <= excelRange.Columns.Count; row++) { var cellText = excelRange[row, column].Text.ToString(); } } 属性 应始终为Text,因此您可以执行此操作,几乎可以肯定有效:

Text

只是对象模型返回string,所以尽管它是string cellText = excelRange.Cells[row, column].Text; ,但可能性是敞开的,也许它不会。

我的强烈推荐 - 我认为大多数开发人员会同意 - 是放弃Excel Interop并从中运行,而是使用类似EPPlus的库。有很多例子。

Excel Interop通过实际启动Excel实例并让您访问笨重的VBA对象模型来工作。这是邪恶的。如果您现在打开任务管理器,您可能会看到几个额外的Excel实例,您不希望看到它们。修复这是一个完全不同的令人沮丧的问题。

多年来,Excel文件一直是XML文档的集合,EPPlus可以帮助您将它们作为文档使用,但提供各种辅助方法,以便您可以与工作表,范围,单元格等进行交互。试试吧。相信我,你永远不会回头。

以下是添加EPPlus Nuget package后的示例:

dynamic

太棒了。没有启动或关闭应用程序 - 您只是从文件中读取。没有奇怪的COM对象。而且这些对象都是强类型的。 string属性返回var pathToYourExcelWorkbook = @"c:\somepath\document.xlsx"; using (var workbookPackage = new ExcelPackage(new FileInfo(pathToYourExcelWorkbook))) { var workbook = workbookPackage.Workbook; var sheet = workbook.Worksheets[1]; // 1-based, or use the name. for (var row = 1; row <= 10; row++) { for (var column = 1; column <= 10; column++) { var cellText = sheet.Cells[row, column].Text; } } }