gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:13:02 26 4
gpt4 key购买 nike

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

编辑:

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

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 并从每个范围中获取值。

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

这应该做到或接近:

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 对象的引用而必须执行的所有操作。

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

关于c# - 来自非线性 Excel 范围 C# 的不同列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43789675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com