Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与非线性Excel范围C不同的列表_C#_Excel_Vsto_Office Interop - Fatal编程技术网

C# 与非线性Excel范围C不同的列表

C# 与非线性Excel范围C不同的列表,c#,excel,vsto,office-interop,C#,Excel,Vsto,Office Interop,我有以下问题。第一位代码的工作原理是将所有不同的值拉入一个列表框,供用户查看。然而,当数据被过滤时,它仍然会拉入所有隐藏的值,这不是我想要的。当我尝试只将可见单元格拉入范围时,它破坏了将范围转换为不同列表的过程。有没有想过为什么打破这个范围会打破这个?系统上的代码中断。数组myvalues行出现错误Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型“string”转换为“System.Array”。我觉得很奇怪 工作代码: Ra

我有以下问题。第一位代码的工作原理是将所有不同的值拉入一个列表框,供用户查看。然而,当数据被过滤时,它仍然会拉入所有隐藏的值,这不是我想要的。当我尝试只将可见单元格拉入范围时,它破坏了将范围转换为不同列表的过程。有没有想过为什么打破这个范围会打破这个?系统上的代码中断。数组myvalues行出现错误Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型“string”转换为“System.Array”。我觉得很奇怪

工作代码:

Range values = sht.Range[cell1, cell2];
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
Range values = sht.Range[cell1, cell2].SpecialCells(XlCellType.xlCellTypeVisible);
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
破坏代码:

Range values = sht.Range[cell1, cell2];
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
Range values = sht.Range[cell1, cell2].SpecialCells(XlCellType.xlCellTypeVisible);
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
编辑:

隐藏范围和不隐藏范围时要处理的工作代码:

var extractedFromSheet = new List<object>();
            foreach (Range area in values.Areas)
            {
                var areaValue = area.Value;
                if (areaValue is Array) // The area contains multiple cells
                {
                    var arr = (Array)areaValue;
                    extractedFromSheet.AddRange(arr.OfType<object>().Select(o => o .ToString()));
                }
                else // The area contains one cell
                {
                    extractedFromSheet.Add(areaValue);
                }
            }
            var distinct = extractedFromSheet.Distinct();
xlCellTypeVisible返回非连续范围。该范围具有.Areas属性,每个属性也是一个范围。尝试遍历values.area并从每个范围中获取值

您还需要检查这些值中的每一个,因为根据区域包含一个单元格还是多个单元格,这些值可以是单个值,也可以是一个数组。这可能就是你看到的错误。它从一个单元格中读取单个字符串,因此不返回数组

这应该可以做到,或者很接近:

var extractedFromSheet = new List<object>();
foreach(Range area in values.Areas)
{
    var areaValue = area.Value;
    if(areaValue is Array) // The area contains multiple cells
    {
        extractedFromSheet.AddRange((System.Array)areaValue);
    }
    else // The area contains one cell
    {
        extractedFromSheet.AddRange(areaValue);
    }
}
var distinct = extractedFromSheet.Distinct();
属性可以返回任何类型的对象或数组,这有点混乱。我甚至都不记得为了确保COM对象的引用被清除而必须做的所有事情


无法重现错误。我看到的是,当范围的某些部分被过滤器隐藏时,范围被划分为多个区域。但这不会导致错误,但该值只返回第一个区域。谢谢,我实际上不知道.Areas属性。今天我将尝试一下。我也是,我曾在Excel工作过一段时间。它令人困惑,因为它打破/忽略了OOP的所有原则。范围的行为应与范围的行为类似。但是,知道你有一个范围并不能告诉你它是如何运行的,所以我不得不将你的If语句改为下面的语句,以使它在所有情况下都能工作。对于这些对象来说,这是一种非常奇怪的行为方式。如果areaValue为Array//则该区域包含多个单元格{var arr=ArrayareaValue;extractedFromSheet.AddRangearr.OfType.Selecto=>o.ToString;}否则//该区域包含一个单元格{extractedFromSheet.AddareaValue;}