来自非线性 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
我遇到以下问题。第一部分代码通过将所有不同的值拉入列表框供用户查看来工作。但是,当数据被过滤时,它仍然会提取所有隐藏的值,这不是我想要的。当我试图只将可见单元格拉入范围时,它破坏了我的范围到不同列表的转换。关于为什么打破范围打破这个的任何想法? 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