我正在尝试读取 excel 空/空白值。
我研究了数百种解决方案,要么我实现错误,要么它似乎不起作用并导致 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'Cannot perform runtime binding on a null reference'
这是我尝试的最后一个代码之一。(因为我试图将 NA 放在所有空单元格中)
for (int i = 2; i <= rowCount; i++)
{
string natext = xlRange.Value2[rowCount, colCount];
if (natext == null)
{
natext = "NA";
}
有什么想法可以帮助我举一些例子吗?
If the click the details it shows: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
HResult=0x80131500 Message=Cannot perform runtime binding on a null reference Source=
StackTrace:
最佳答案
首先,Excel 对象模型真的很奇怪。 Value2
返回 object
,并且该对象可以是各种不同的类型。如果 xlRange
是一个单元格,然后它返回该单元格的值,可以是 string
或 double
或者是其他东西。如果 xlRange
是多个单元格,那么 object
是一个值数组。然后每个值都是 object
.对于您不知道是否为 string
的每个值或 double
或者是其他东西。
处理这件事并不好玩。它实际上非常非常糟糕。 C# 是一种强类型语言,这意味着您知道所有内容是什么类型,而无需猜测。 Excel Interop 将它从你身上拿走并说:“这是一个对象。它可以是任何东西或很多东西,每个都可以是任何东西。弄清楚。祝你好运。”
而不是得到 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
属性(property)。 Text
属性应始终为 string
所以你可以这样做,它几乎肯定会起作用:string cellText = excelRange.Cells[row, column].Text;
只是对象模型返回
dynamic
, 所以即使它是 string
,可能性是开放的,也许它不会。我的强烈建议——我认为大多数开发人员会同意——放弃 Excel 互操作并从中运行,并使用像 EPPlus 这样的库。反而。有很多例子。
Excel Interop 通过实际启动 Excel 实例并让您访问笨重的 VBA 对象模型来工作。这是邪恶的。如果您现在打开任务管理器,您可能会看到几个您没想到的额外 Excel 实例已打开。解决这个问题是一个完全不同的令人沮丧的问题。
多年来,Excel 文件只是 XML 文档的集合,EPPlus 帮助您将它们作为文档处理,但提供了各种帮助方法,以便您可以与工作表、范围、单元格等进行交互。试试看。相信我,你永远不会回头。
这是添加 EPPlus Nuget package 后的示例:
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;
}
}
}
这很棒。无需启动或关闭应用程序 - 您只是从文件中读取。没有奇怪的 COM 对象。并且对象都是强类型的。
Text
属性返回 string
.
关于c# - 读取excel空/空白值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48846266/