Как определить тип массива в C # с помощью VTSO в Excel? - PullRequest
0 голосов
/ 11 мая 2018

Мне было интересно, возможно ли определить тип массива из диапазона Value2. Например, если у нас есть только числа, занимающие ячейки от А1 до А5 в Excel. Каждая ячейка на самом деле двойная в C # VTSO.

Однако, если мы прочитаем это, используя следующую строку:

object t = Application.get_Range("A1:A5").Value2;

Мы можем определить, что t на самом деле является массивом. Итак, мы можем сделать:

object[,] t = Application.get_Range("A1:A5").Value2;

Для чтения отдельных элементов массива. Но как определить тип массива?

Единственный метод, который я могу придумать, - это попытаться привести его к удвоению [,] или string [,], а затем обернуть его в оператор try catch. Или это тот случай, когда я всегда выполняю строку [,] в Excel всегда удастся?

Я понимаю, что непосредственное приведение его, например, из объекта [,] в строку [,] не работает. Я думаю, вам нужно изменить его для каждого элемента.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Единственный правильный тип времени компиляции для 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, если вы не выполняете управление памятью правильно, и это просто грязно

0 голосов
/ 11 мая 2018

В C # вы можете просто использовать ключевое слово var.

Итак: var t = Application.get_Range("A1:A5").Value2;

Чтобы заново ввести объекты в t, вы должны сделать это вручную для каждого объекта.Просто приведите объект к типу, который вы ожидаете.

...