我们如何在Excel中使用VTSO确定C#中的数组类型?

时间:2018-05-11 06:38:15

标签: c# excel-2016

我想知道是否可以从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中成功?

我意识到直接将它从对象[,]转换为字符串[,]例如不起作用。我想,你需要为每个元素改变它。

2 个答案:

答案 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;
     (...)
  }
}

另外,在处理范围时,不要试图使用foreachlinq Cast(),请坚持上面的for循环。 Foreach / Linq可能乍一看(好吧可能在应用程序的生命周期内工作),但它们都使用GetEnumerator(),这在办公室API中是漏洞,除非你记忆管理正确,而且只是凌乱。