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

我在下面有问题。 代码的第一部分通过将所有不同的值拉入列表框供用户查看。 但是,当数据被过滤时,它仍然拉入所有不是我想要的隐藏值。 当我试图只将可见的单元格拉到范围内,它打破了我的范围转换为一个清晰的列表。 任何想法为什么打破范围打破这个? System.Array myvalues代码中断行“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法转换types'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(); 

编辑:

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

 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返回一个不连续的Range 。 该范围有一个.Areas属性,每个属性也是一个Range 。 尝试迭代values.Areas并从每个范围获取值。

您还需要检查每个值,因为它可能是单个值或数组,取决于区域是否包含一个单元格或多个单元格。 这可能是你看到的错误。 它从一个单元格读取单个string,所以它不返回数组。

这应该做或接近:

 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(); 

有点混乱,一个属性可以返回任何types的对象或数组。 我甚至不记得你必须做的所有事情,以确保COM对象的引用得到清理。

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.areas.aspx