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

Distinct List from nonlinear Excel Range C#

我遇到以下问题。第一部分代码通过将所有不同的值拉入列表框供用户查看来工作。但是,当数据被过滤时,它仍然会提取所有隐藏的值,这不是我想要的。当我试图只将可见单元格拉入范围时,它破坏了我的范围到不同列表的转换。关于为什么打破范围打破这个的任何想法? System.Array myvalues 行代码中断,错误 "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot convert type 'string' to '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 return 是一个不连续的 Range。该范围有一个 .Areas 属性,每个也是一个 Range。尝试遍历 values.Areas 并从每个范围中获取值。

您还需要检查每个值,因为它可能是单个值或数组,具体取决于该区域是包含一个单元格还是多个单元格。这可能是您看到的错误。它从一个单元格中读取单个字符串,因此它不是 returning 数组。

这应该可以做到或接近:

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

属性 可以 return 任何类型的对象或数组,这有点混乱。我什至不记得为确保清除对 COM 对象的引用而必须执行的所有操作。

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