2009-05-04 9 views
0

J'écris un complément Excel qui héberge IronPython 1.1 et je veux fournir l'objet COM Excel.Application à l'instance PythonEngine.Comment faire pour exécuter un ironpython hébergé 1.1 à partir d'un complément Excel?

Mon C# peut très bien accéder aux membres de l'objet COM. Cependant, lorsque mon script IronPython accède aux membres de l'objet COM, j'obtiens un "System.ArgumentException: l'objet de type" System.Int32 "ne peut pas être converti en" System.UInt32 & "."

Voici mon code C# hébergement IronPython 1.1:

public void ExecuteFile(string path) { 
    // see if COM object works 
    Debug.WriteLine(Globals.ThisAddIn.Application.ActiveWindow.Caption); 

    engine.Globals.Add("excel", Globals.ThisAddIn.Application); 

    try 
    { 
     engine.ExecuteFile(path); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex); 
    } 
} 

et voici mon script de test IronPython:

excel.ActiveSheet.Range['A1'].Value2 = 42 // jette exception mentionnée ci-dessus

+0

Avez-vous essayé de faire ce que votre script python fait par C#? Est-ce que ça marche? Je sais, vous avez dit que l'accès fonctionne bien, mais je veux juste être sûr. – Rohit

+0

J'ai essayé ça. Par exemple cette ligne de C# affiche la valeur de la cellule A4: Debug.WriteLine ("C#:" + \ this.Range ["A4", manquant] .Value2.ToString() ); Bien que cette ligne de python lancers francs l'exception mentionnée: Debug.WriteLine ("Python:" + \ sheet.Range [ "A4", manquant] .Value2.ToString() ) Où feuille 'est une variable fournie au moteur ironpython hébergé. – Mads

+0

Un couple de méthodes COM Excel et propriétés fonctionnent bien (Application.Visible est ok IIRC) mais la plupart échouent avec l'exception mentionnée. J'ai essayé de faire un projet similaire ciblant Word et il semble fonctionner très bien. Je cours VS2008, Office2007, Vista SP1. – Mads

Répondre

1

Je crois que pour définir .Value vous devez "indexer" avec le type de données; il est plus pratique de définir .Value2 à la place (il peut être réglé directement). Que se passe-t-il si vous utilisez .Value2 au lieu de .Value dans cette affectation Python?

0

Un bon article avec des explications et une solution est ici:

Fondamentalement, j'ai opté pour désactiver le proxy VSTO qui enveloppe l'objet COM Excel. Il peut être fait avec cette ligne dans AssemblyInfo.cs:

[assemblage: ExcelLocale1033 (false)]

Questions connexes