Boo - Автоматизация Excel, проблемы с выбором диапазонов

StackOverflow https://stackoverflow.com/questions/1829150

  •  11-09-2019
  •  | 
  •  

Вопрос

Я изучаю Boo и подумал, что было бы полезным упражнением попробовать преобразовать пару почтенных VB-скриптов, автоматизирующих Excel (в данном случае 2007).Кажется, что многие вещи переводятся очень легко, однако у меня возникают огромные проблемы с выбором диапазонов - всякий раз, когда я пытаюсь получить или установить их, я получаю сообщение TargetInvocationException Member not found .

Вот (сокращенный) пример, который я запустил в 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")

Некоторые вещи работают нормально, например, установка свойства Name листа и так далее, но как мне работать с диапазонами?Существуют ли какие-то специальные методы, которые скрывает VB, которые мне нужно было бы вызвать, и если да, то как мне их найти?

Ваше здоровье,

Ленни.

Это было полезно?

Решение

Range на самом деле является свойством, и это несколько особенное свойство в том смысле, что оно работает как индексатор, что означает, что оно имеет семантику, подобную массиву или словарю.На большинстве языков это означает, что вы получите доступ sht.Range["A1"].Это синтаксический сахар, и на самом деле доступ к нему осуществляется так же, как и к любому другому методу, а именно:

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

Я попытался использовать Boo, Ruby и IronRuby для повторения вашего кода, используя как синтаксический стиль sugar, так и явный вызов метода.В IronRuby я могу заставить его работать безупречно, но только в 32-разрядном интерпретаторе.В обычном Ruby, который является 32-разрядным приложением в моей конфигурации, это также работало нормально.В 64-разрядном интерпретаторе свойство Range никогда не разрешалось корректно.

Итак, это навело меня на подозрение, что интерактивная оболочка Boo работала в 64-разрядном режиме и из-за этого происходил сбой взаимодействия.К сожалению, те же проблемы повторились после настройки моих локальных двоичных файлов Boo для запуска в 32-разрядном режиме с использованием CORFLAGS.exe, поэтому я не думаю, что это реальная проблема.

Что, однако, сработало, так это явный импорт библиотеки взаимодействия Excel Dotnet, а также пространств имен служб взаимодействия, например:

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

Тогда:

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

Все это работает, но по сути они требуют от вас отказаться от "Скриптовости", к которой вы привыкли из-за поздней привязки (именно это делает ваш duck typing).

Одно из отличий от VB / VBScript, которое верно для большинства языков (кроме C # 4.0), заключается в том, что, как правило, необязательные параметры обрабатываются непрозрачно, поэтому вам нужно будет более внимательно изучать API, когда вы имеете дело с методами, поддерживающими необязательные параметры (заменяя их на System.Type.Missing или System.Эквивалент отражения).Вы найдете это в документах Excel interop docs, хотя, вероятно, вы можете использовать отражение для определения параметров, помеченных как необязательные, если сочтете это проще, чем искать их.

Поскольку у Ruby есть разумное решение для поздней привязки этих объектов, я подозреваю, что в сценариях COM-взаимодействия в Boo отсутствует функция (или ошибка).

Отредактировано для добавления: Сэм Нг пишет о поддержке индексированных свойств в C # 4.0;проблемы, описанные в его посте, вероятно, относятся и к Бу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top