c# - 读取excel空/空白值

标签 c# excel visual-studio-2017

我正在尝试读取 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是一个单元格,然后它返回该单元格的值,可以是 stringdouble或者是其他东西。如果 xlRange是多个单元格,那么 object是一个值数组。然后每个值都是 object .对于您不知道是否为 string 的每个值或 double或者是其他东西。

处理这件事并不好玩。它实际上非常非常糟糕。 C# 是一种强类型语言,这意味着您知道所有内容是什么类型,而无需猜测。 Excel Interop 将它从你身上拿走并说:“这是一个对象。它可以是任何东西或很多东西,每个都可以是任何东西。弄清楚。祝你好运。”

而不是得到 Value2范围的属性,然后循环遍历数组,处理范围内的单元格要容易得多。

鉴于 excelRangeRange细胞:

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/

相关文章:

mysql - Excel 和 MySQL -- 运行时错误 '13' : Type mismatch

excel - 如何在 Excel 中写入一系列数字

c# - 将 .net core 项目发布到 iis 时出现 HTTP 错误 500.19 0x80070005

c# - 我可以在 C# 中将 json 反序列化为匿名类型吗?

java - 扫描问题

visual-studio - 如何安装旧版本的 Visual Studio 2017?

c# - Visual Studio - SQL Server 数据库项目的连接字符串

c++ - OpenClaw.exe 中 0x74E733AB (ucrtbase.dll) 处的未处理异常

c# - 如何知道继承的泛型类型的基类型?

c# - 在这种情况下应该使用什么设计模式?