我想知道是否可以从Value2范围确定数组类型。例如,如果我们只有数字占用Excel中的单元格A1到A5。然后,每个单元格实际上是C#VTSO中的两倍。
但是,如果我们使用以下行阅读它:
object t = Application.get_Range("A1:A5").Value2;
我们可以确定t实际上是一个数组。所以,我们可以这样做:
object[,] t = Application.get_Range("A1:A5").Value2;
读取数组的各个项目。但是我们如何确定阵列类型?
我能想到的唯一方法是尝试将其转换为double [,]或string [,]然后将其包装在try catch语句中。 或者,如果我做字符串[,]总是在Excel中成功?
我意识到直接将它从对象[,]转换为字符串[,]例如不起作用。我想,你需要为每个元素改变它。
答案 0 :(得分:0)
在C#中,您只需使用var
关键字。
所以:var t = Application.get_Range("A1:A5").Value2;
要在t
中重新键入对象,必须手动为每个对象执行此操作。只需将对象转换为您期望的类型。
答案 1 :(得分:0)
您可以安全地假设Value2
唯一正确的编译时类型是object
。任何其他假设都会产生非常脆弱的代码。您必须根据每个单元格的运行时类型明确说明您的意图。也就是说,直接在Value2
结果上调用get_Range
可能不是您想要做的。
相反,迭代返回的范围(它是基于1的):
var targetRange = Application.get_Range("A1:A5");
for (int i = 1; i <= targetRange.Count; i++)
{
// Range Item returns... Range! Gotta love this API...
var range = (Range)targetRange.Item[i];
object value = range.Value2;
// Test-and-cast
if (value is string) {
var strValue = (string)value;
// Do string things
}
elseif (value is double) {
var dValue = (double)value;
// Do double things
}
(...)
// For C#7 or above, use 'pattern matching switch' instead of above test-and-cast
switch(value) {
case string strValue:
// Do string things
break;
case double dValue:
// Do double things
break;
(...)
}
}
另外,在处理范围时,不要试图使用foreach
或linq
Cast()
,请坚持上面的for
循环。 Foreach / Linq可能乍一看(好吧可能在应用程序的生命周期内工作),但它们都使用GetEnumerator()
,这在办公室API中是漏洞,除非你记忆管理正确,而且只是凌乱。