我正在尝试读取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:
答案 0 :(得分:1)
首先,Excel对象模型真的很奇怪。 namespace
返回export = 0;
,该对象可以是各种不同的类型。如果Value2
是一个单元格,则它会返回该单元格的值,该值可能是object
或xlRange
或其他内容。如果string
是多个单元格,那么double
是一个值数组。然后每个值都是xlRange
。对于每个值,您不知道它是object
还是object
还是其他值。
处理这个问题并不好玩。这实际上非常非常糟糕。 C#是一种强类型语言,这意味着你知道什么类型的东西,你不必猜测。 Excel Interop从你那里拿走了它,然后说:“这是一个对象。它可以是任何东西,也可以是任何东西。可以把它弄清楚。祝你好运。”
不是获取范围的string
属性然后循环遍历数组,而是更容易处理范围中的单元格。
鉴于double
是Value2
个单元格:
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;
}
}
}
。