Как запустить размещенный ironpython 1.1 из надстройки Excel?

Я пишу надстройку Excel, в которой размещается IronPython 1.1, и я хочу предоставить COM-объект Excel.Application экземпляру PythonEngine.

Мой С# может нормально обращаться к членам COM-объекта. Однако, когда мой сценарий IronPython обращается к элементам COM-объекта, я получаю «System.ArgumentException: объект типа System.Int32 не может быть преобразован в тип System.UInt32&».

Вот мой код C#, на котором размещен 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);
    }
}

и вот мой тестовый скрипт IronPython:

excel.ActiveSheet.Range['A1'].Value2 = 42 // выдает исключение, указанное выше


person Mads    schedule 04.05.2009    source источник
comment
Вы пытались делать то, что делает ваш скрипт Python, через C#? Это работает? Я знаю, ты сказал, что доступ работает нормально, но я просто хочу быть уверен.   -  person Rohit    schedule 04.05.2009
comment
Я пробовал это. Например, эта строка C# выводит значение ячейки A4: Debug.WriteLine(C#: + \ this.Range[A4, отсутствует].Value2.ToString()); В то время как эта строка python выдает упомянутое исключение: Debug.WriteLine(Python: +\sheet.Range[A4, Missing].Value2.ToString() ) Где «лист» — это переменная, предоставляемая размещенному движку ironpython.   -  person Mads    schedule 05.05.2009
comment
Несколько методов и свойств Excel COM работают нормально (Application.Visible в порядке IIRC), но большинство из них терпят неудачу с упомянутым исключением. Я попытался сделать аналогичный проект, ориентированный на Word, и, похоже, он работает нормально. Я использую VS2008, Office2007, Vista SP1.   -  person Mads    schedule 05.05.2009


Ответы (2)


Я считаю, что для установки .Value вам нужно «индексировать» его с типом данных; Вместо этого удобнее установить .Value2 (его можно установить напрямую). Итак, что произойдет, если вы используете .Value2 вместо .Value в этом назначении Python?

person Alex Martelli    schedule 04.05.2009

Хорошая статья с пояснениями и решением тут:

http://codeidol.com/csharp/c-sharp-in-office/Working-with-Excel-Objects/Special-Excel-Issues/

По сути, я решил отключить прокси-сервер VSTO, который обертывает COM-объект Excel. Это можно сделать с помощью этой строки в AssemblyInfo.cs:

[сборка: ExcelLocale1033 (ложь)]

person Mads    schedule 11.05.2009