C# Interop.Excel '#N/A' 单元格值转换为 -2146826246

标签 c# excel office-interop excel-interop

我有一个 C# 应用程序,它利用 Interop.Excel (v15) 打开一些客户数据工作簿,解析它们并输出一些信息。我遇到的问题是某些工作簿单元格的值为#N/A;在 Excel 中,它是一个 CVErr,表明存在某种类型的错误。在我们的客户数据上下文中,他们使用#N/A 来表示不适用 - 没有潜在的公式问题,这只是他们使用的值。

当我使用以下函数遍历工作表行时,每次遇到 #N/A 时,我都会得到 -2146826246 的 Int 值:

private void traverseRows(Excel._Worksheet worksheet)
{
    //Get the used Range
    Excel.Range usedRange = worksheet.UsedRange;

    //Last Row/Column
    int lastUsedRow = usedRange.Row + usedRange.Rows.Count - 1;
    int lastUsedColumn = usedRange.Column + usedRange.Rows.Columns.Count;

    foreach (Excel.Range row in usedRange.Rows)
    {
        List<String> rowData = rangeToList(row);
    }
}

List<string> rangeToList(Microsoft.Office.Interop.Excel.Range inputRng)
{
    object[,] cellValues = (object[,])inputRng.Value2;
    List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x));
    return lst;
}

Visual Studio Debug

我尝试单独检查每个单元格,但这使应用程序速度减慢到无法使用的程度(大多数工作簿有 10,000 行 X 38 列)。我尝试转换为 Text、Value 和 Value2,但无济于事。我需要能够以真实形式读取 #N/A 值,以便我可以运行比较并稍后将值输出到另一个工作簿。实现这一目标的最佳方法是什么?

最佳答案

下面的链接可能会对您有所帮助。

https://xldennis.wordpress.com/2006/11/29/dealing-with-cverr-values-in-net-part-ii-solutions/

我不确定,但我的建议是,由于 -2146826246 是 #N/A 值的代码,您可以检查单元格值/文本是否相同,并且可以将 #N/A 添加为列表中的文本“lst”。

但更好的方法是使用 OpenXml 从 Excel 检索数据。

关于C# Interop.Excel '#N/A' 单元格值转换为 -2146826246,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802142/

相关文章:

vba - 压缩大量(不切实际的)基于循环的 VBA 代码;嵌套 For...Next 循环

javascript - 如何在 HTML/CSS/JS 中实现类似 Excel 2007 数据栏的功能?

vb.net - 在 Vb.net 中以编程方式处理 PowerPoint Presenter View 对象事件

c# - 创建 Excel 应用程序时出现 COM 异常 80040154

c# - Linq-To-Entities 使用方法选择新对象

c# - SQL注入(inject)存储过程

c# - Xamarin forms 单击一次显示上下文菜单

c# - 实例化类而不将其保存在对象中是一种糟糕的编程习惯吗?

vba - 在组合框和列表框上为 ListFillRange 使用表格列

excel - 如何获取默认的 Excel 工作表字体?