Frage

Ich unter Boo und dachte, es wäre eine nützliche Übung sein, ein paar ehrwürdigen VB-Skripte, um zu versuchen, die Umwandlung von Excel (2007, in diesem Fall) zu automatisieren. Viele Dinge scheinen sehr leicht zu übersetzen, aber eine riesige Menge an Schwierigkeiten der Auswahl Bereiche Ich habe -. Wenn ich versuche, sie zu bekommen oder richte ich ein TargetInvocationException Mitglied bekommen nicht gefunden

Hier ist ein (abgeholzt) Beispiel, das ich in booish ausgeführt habe:

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")

Einige Dinge funktionieren, wie die Eigenschaft Namen des Blattes Einstellung und so weiter, aber wie kann ich mit Bereichen arbeiten? Gibt es einige spezielle Methoden, die VB versteckt, dass ich anrufen müssen würde, und wenn ja, wie würde ich mich über diejenigen heraus zu finden?

Cheers,

Lenny.

War es hilfreich?

Lösung

Der Bereich ist eigentlich eine Eigenschaft, und es ist eine etwas besondere Eigenschaft, dass sie als Indexer arbeiten, was bedeutet, dass es Array- oder Wörterbuch-ähnliche Semantik hat. In den meisten Sprachen, das bedeutet, dass Sie sht.Range["A1"] zugreifen würde. Das ist syntaktischer Zucker, und es ist wirklich wie jede andere Methode zugegriffen, und zwar:

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

Ich hat versucht, Boo, Ruby und IronRuby zu verwenden, um Ihren Code zu wiederholen, sowohl den syntaktischen Zucker Stil und den expliziten Methodenaufruf. In IronRuby, ich kann es funktionieren einwandfrei erhalten, aber nur in den 32-Bit-Interpreter . In regelmäßigem Rubin, die eine 32-Bit-Anwendung auf meiner Konfiguration ist, funktionierte es auch in Ordnung. In den 64-Bit-Interpreter wurde die Range-Eigenschaft nie richtig aufgelöst.

So, das mich dazu gebracht, zu vermuten, dass die Boo Interactive Shell wurde in 64-Bit-Modus ausgeführt wird und dass Interop deswegen versagt. Leider reproduzierten die gleichen Probleme, die nach meinem lokalen Boo-Binärdateien Einstellung in 32-Bit-Modus läuft CORFLAGS.exe verwenden, so dass ich glaube nicht, das ist das eigentliche Problem.

Was funktioniert hat, war jedoch explizit die Excel Dotnet Interop-Bibliothek sowie die Interop-Dienste Namensraum zu importieren, etwa so:

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

Dann:

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

All diese Arbeit, aber sie erfordern im Wesentlichen Sie die „Scriptiness“ aufgeben Sie gewöhnt sind von später Bindung (das, was ist Ihre Ente eingeben tut).

Ein Unterschied von VB / VBScript, die für die meisten Sprachen (außer C # 4.0) wahr ist, ist, dass im Allgemeinen, sind optionale Parameter transparent nicht behandelt, so dass Sie bei der API genauer schauen brauchen würden, wenn man mit Methoden beschäftigen dass die Unterstützung optionale Parameter (diese mit System.Type.Missing oder System.Reflection Äquivalent ersetzt). Sie würden diese durch den Excel Interop-docs finden, obwohl Sie wahrscheinlich Reflexion verwenden können Parameter als optional markiert zu identifizieren, wenn Sie die leichter finden, als es nach oben.

Da Ruby eine vernünftige Lösung hat für diese Objekte der späten Bindung, ich vermute, es ist ein fehlendes Feature (oder Fehler) in COM-Interop-Szenarien in Boo.

Edited hinzufügen: Sam Ng schreibt über indizierte Eigenschaft Unterstützung in C # 4.0 ; die in seinem Beitrag beschriebenen Probleme treten wahrscheinlich Boo, wie gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top