Pregunta

Estoy investigando Boo y pensé que sería un ejercicio útil para tratar de convertir un par de secuencias de comandos que automatizan venerables VB Excel (2007 en este caso). Una gran cantidad de cosas parece traducirse muy fácilmente, sin embargo estoy teniendo una gran cantidad de problemas para seleccionar rangos -. Siempre que intente obtener o establecer ellos consigo un miembro TargetInvocationException no encontrado

Esto es un (reducir) ejemplo me he encontrado en booish:

def CreateInstance(progid):
    type = System.Type.GetTypeFromProgID(progid)    
    return type()   

xl as duck = CreateInstance("Excel.Application")
xl.Visible = true
xl.Workbooks.Add

sht as duck = xl.ActiveSheet
#Next line throws exception
rng as duck = sht.Range("A1")

Algunas cosas funcionan bien, como el establecimiento de la propiedad Nombre de la hoja y así sucesivamente, pero ¿Cómo se trabaja con rangos? ¿Hay algunos métodos especiales que VB oculta que había necesidad de llamar, y si es así ¿cómo iba a ir sobre la búsqueda de los que fuera?

Saludos,

Lenny.

¿Fue útil?

Solución

El rango es de hecho una propiedad, y es una propiedad de un tanto especial, ya que funciona como un controlador paso a paso, lo que significa que tiene Expandido o la semántica del diccionario similar. En la mayoría de los idiomas, eso significa que es posible acceder a sht.Range["A1"]. Es decir azúcar sintáctico, y realmente al que accedan al igual que cualquier otro método, a saber:

sht.get_Range("A1",System.Reflection.Missing.Method)

he tratado de usar Boo, Ruby y IronRuby repetir su código, usando tanto el estilo azúcar sintáctico y el llamado método explícito. En IronRuby, puedo conseguir que funcione sin problemas, pero sólo en el intérprete de 32 bits . En Rubí regular, que es una aplicación de 32 bits en la configuración de mi, sino que también funcionaba bien. En el intérprete de 64 bits, la propiedad Range nunca fue resuelto correctamente.

Así que me llevó a sospechar que el intérprete interactivo Boo se ejecuta en modo de 64 bits y que interoperabilidad estaba fallando debido a eso. Por desgracia, los mismos problemas reproducidos después de ajustar mis binarios Boo locales para ejecutarse en modo de 32 bits utilizando CORFLAGS.exe, por lo que no creo que ese es el verdadero problema.

Lo que hizo el trabajo, sin embargo, fue para importar explícitamente la Biblioteca Dotnet Excel interoperabilidad, así como los espacios de nombres de servicios de interoperabilidad, así:

import Microsoft.Office.Interop.Excel
import System.Runtime.InteropServices

xl_type=typeof(Application).GetCustomAttributes(typeof(CoClassAttribute),true)[0].CoClass
xl=xl_type()
xl.Visible=true
xl.Workbooks.Add

A continuación:

xl.Range["A1","A2"].Value=12
xl.Range["A1",System.Type.Missing].Value="Alpha"
(xl.ActiveSheet as Worksheet).Range["A1","A2"].Value2='Whatever'

Todos estos trabajos, sino que esencialmente requieren que se renuncia a la "Scriptiness" que está acostumbrado a la ligadura dinámica (que es lo que su tipificación de pato está haciendo).

Una diferencia de VB / VBScript que es cierto para la mayoría de los idiomas (que no sea C # 4.0) es que, en general, los parámetros opcionales no se manejan de forma transparente, por lo que había necesidad de mirar a la API con más cuidado cuando se trabaja con métodos que los parámetros opcionales de apoyo (reemplazándolos con System.Type.Missing o el equivalente System.Reflection). Que iba a encontrar esto a través de los documentos de interoperabilidad de Excel, aunque es probable que pueda utilizar la reflexión para identificar los parámetros marcados como opcional si usted encuentra que sea más fácil que mirar hacia arriba.

Debido a que Ruby tiene una solución razonable para estos objetos finales vinculante, sospecho que hay una característica que falta (o error) en escenarios de interoperabilidad COM en Boo.

Editado para añadir: Sam Ng escribe sobre la característica de propiedades indexadas en C # 4.0 ; los problemas descritos en su puesto probable que se aplican a Boo, también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top