c# - Return type of Application.Evaluate in exotic cases -


i trying write method in c# will, given name of named range in excel workbook, retrieve values in range. i'd work if named range isn't pure reference range (e.g. =sheet1!a1:a10) instead ={1,2,3,4,5} or =offset(sheet1!a1:a10,3).

i'm doing following:

excel.application xl = ...; excel.name name = ...;  object value = xl.evaluate(name.value); // if it's range, turn object[] or object[,] if (value excel.range) value = ((excel.range)value).value2;  if (value object[]) {     // stuff } else if (value object[,]) {     // different stuff } 

i had thought named range value ={1,2,3,4,5} come out object[] or object[,], doesn't. value.gettype() reports system.__comobject (edit: i'm getting system.object[*], , haven't been able reproduce system.__comobject - still doesn't cast object[]), , haven't been able narrow down further.

what type should casting value to?

edit: here test code , output. may simpler question of "what heck system.object[*], vagaries of google don't permit me search for.

code:

using system; using excel = microsoft.office.interop.excel;  namespace test {     class program     {         static void main(string[] args)         {             excel.application xl = new excel.application();             object value = xl.evaluate("={1,2,3,4,5}");             console.writeline(value);             console.writeline(value object[]);             console.writeline(value.gettype());             console.readline();             xl.quit();         }     } } 

output:

system.object[*]

false

system.object[*]

edit2: if instead evaluate "={1;2;3;4;5}" object[,]. huh.

i think it's because array created excel not 0-based, 1-based, can convert this:

object[] ints = ((array)value).toarray<object>(); 

with helper method extension:

public static t[] toarray<t>(this array array) {     if (array == null)         return null;      if (array.rank != 1)         throw new notsupportedexception();      var newarray = new t[array.getlength(0)];     var lb = array.getlowerbound(0);     (int = 0; < newarray.length; i++)     {         newarray[i] = (t)array.getvalue(i + lb);     }     return newarray; } 

if use .net 4, there chances return type of evaluate defined dynamic. code:

dynamic value = xl.evaluate("={1,2,3,4,5}"); // or var instead of dynamic 

you system.invalidcastexception: unable cast object of type 'system.object[*]' type 'system.object[]' because new .net 4 interop layer try automatically create standard array. need instead (like in code):

object value = xl.evaluate("={1,2,3,4,5}"); object[] ints = ((array)value).toarray<object>(); 

Comments

Popular posts from this blog

c# - DetailsView in ASP.Net - How to add another column on the side/add a control in each row? -

javascript - firefox memory leak -

Trying to import CSV file to a SQL Server database using asp.net and c# - can't find what I'm missing -