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