Во-первых, ваше решение не может быть Excel UDF (пользовательская функция). В наших руководствах мы даем следующее определение: «UDF Excel используются для создания пользовательских функций в Excel, чтобы конечный пользователь мог использовать их в формулах». Я не возражаю, если вы предложите более точное определение :)
Это определение показывает, что UDF не может добавить кнопку в пользовательский интерфейс (я знаю, что XLL могут изменять пользовательский интерфейс CommandBar) или перехватывать сочетания клавиш, а также События Excel.
То есть ExcelDNA выходит за рамки, поскольку он предназначен для разработки надстроек XLL. То же самое относится к функциональности надстройки Express, нацеленной на Excel, поскольку она позволяет разрабатывать надстройки XLL и надстройки Excel Automation.
Поскольку вам нужно обрабатывать события Excel, ваше решение может быть автономным приложением, но существуют очевидные ограничения такого подхода. Единственный реальный способ - создать надстройку COM; это позволяет обрабатывать события Excel и добавлять пользовательские элементы в пользовательский интерфейс Excel. У вас есть три возможности:
Если говорить о разработке надстройки Excel COM, то 3 вышеупомянутых инструмента предоставляют различные функции: визуальные дизайнеры, шимминг и т. Д. Но я не думаю, что они отличаются в скорость доступа к объектной модели Excel. Скажем, я не знаю (и не могу себе представить), почему получение COM-объекта из AppDomain по умолчанию должно отличаться от получения того же COM-объекта из другого AppDomain. Кстати, вы можете проверить, влияет ли шимминг на скорость работы, создав совместно используемую надстройку, а затем используя COM Shim Wizard для ее шиммирования.
Скорость II. Как я писал вам вчера: «Лучший способ ускорить чтение и запись в диапазон ячеек - это создать переменную типа Excel.Range, ссылающуюся на этот диапазон, а затем прочитать / записать массив из / в свойство Value переменной. " Но вопреки тому, что говорит Франческо, я не приписываю это ВСТО; это особенность объектной модели Excel.
Скорость III. Самые быстрые пользовательские функции Excel написаны на родном C ++, а не на любом языке .NET. Я не сравнивал скорость надстройки XLL, созданной ExcelDNA и Add-in Express; Я не думаю, что вы найдете здесь существенную разницу.
Подводя итог. Я убежден, что вы ошибаетесь: надстройки COM, основанные на надстройках Express, VSTO или Shared Add-in, должны читать и записывать ячейки Excel с одинаковой скоростью. Я буду рад (искренне), если кто-то опровергнет это утверждение.
Теперь о других ваших вопросах. VSTO не позволяет разрабатывать надстройку COM, поддерживающую Office 2000-2010. Требуется три разных кодовых базы и как минимум две версии Visual Studio для полной поддержки Office 2003-2010; вам нужно иметь крепкие нервы и часть удачи для развертывания надстройки на основе VSTO для Excel 2003. С помощью надстройки Express вы создаете надстройку COM для всех версий Office с единой кодовой базой; Надстройка Express предоставляет вам проект установки, который готов установить вашу надстройку в Excel 2000-2010 (32-разрядная и 64-разрядная версия); Развертывание ClickOnce также на борту.
VSTO превосходит Add-in Express в одной области: он позволяет создавать так называемые надстройки уровня документа. Представьте себе рабочую книгу или шаблон с некоторым кодом .NET позади него; Однако я не удивлюсь, если развертывание таких вещей станет кошмаром.
О событиях Excel. Все события Excel перечислены в MSDN, например, см. События Excel 2007
С уважением, из Беларуси (GMT + 2),
Андрей Смолин Руководитель надстройки Express Team
Я сразу могу придумать три варианта ...
Я думаю, что если бы мне это нужно было сделать, я бы использовал Powershell или удалил необходимость все вместе и создать базовую установку виртуальной машины, в которой уже были настроены все основы. Когда я закончу с тестированием, я просто откатываю жесткий диск и снова буду свободен.
Powershell подойдет. Если вы хотите избежать зависимостей, вы также можете сгенерировать скрипт для запуска с AdsUtil.vbs.
Вероятно, проще будет стандартизовать на IIS7, где все это хранится в файлах web.config, что значительно облегчит жизнь.
Вы можете посмотреть файлы конфигурации XML метабазы для IIS и разрешить прямое редактирование.
Я немного опоздал на шоу, но я подумал, что этот сценарий PowerShell будет мне полезен. Имейте в виду, что я использую его только для локальной разработки, поэтому извиняюсь за магические числа.
AuthFlags = 4 - это интегрированная авторизация
Это не совсем соответствует требованиям Марка, но это хорошее начало.
Если вы загрузили Инструменты WMI , вы можете использовать их для изучения интерфейса WMI с метабазой IIS.
function CreateAppPool($poolName,$userName,$password)
{
[wmiclass] $appPoolSettings = "root\MicrosoftIISv2:IISApplicationPoolSetting";
$newPool = $appPoolSettings.CreateInstance();
$newPool.Name = "W3SVC/AppPools/" + $poolName;
$newPool.WAMUsername = $userName;
$newPool.WAMUserPass = $password;
$newPool.AppPoolIdentityType = 3;
$newPool.Put();
# Do it again if it fails as there is a bug with Powershell/WMI
if (!$?)
{
$newPool.Put();
}
}
function CreateWebsite($webSiteName, $path, $port, $appPoolName)
{
[wmiclass] $bindingClass = 'root\MicrosoftIISv2:ServerBinding';
$bindings = $bindingClass.CreateInstance();
$bindings.Port = $port;
$webService = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebService";
$webSite = $webService.CreateNewSite($webSiteName, $bindings, $path);
[int] $index = $webSite.ReturnValue.IndexOf("'") + 1;
[int] $length = $webSite.ReturnValue.Length - $index - 1;
[string] $websiteID = $webSite.ReturnValue.SubString($index, $length) + "/root";
$webVirtualDirSetting = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebVirtualDirSetting" | Where-Object {$_.Name -eq $websiteID};
$webVirtualDirSetting.AppFriendlyName = $webSiteName;
$webVirtualDirSetting.AppPoolId = $appPoolName;
$webVirtualDirSetting.AccessFlags = 517;
$webVirtualDirSetting.AuthFlags = 4;
$webVirtualDirSetting.Put();
#Switch the Website to .NET 2.0
C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -sn W3SVC/
}
$webSiteName = "MyWebsiteName";
$webSitePath = "C:\MyWebsitePath";
$webSitePort = "9001";
$appPoolName = "MyWebsitePool";
$appPoolIdentity = "MYDESKTOP\MyWebsiteIdentity";
$appPoolPassword = "MyWebsitePassword";
CreateAppPool $appPoolName $appPoolIdentity $appPoolPassword
CreateWebsite $webSiteName $webSitePath $webSitePort $appPoolName
может помочь, а может и не помочь, но посмотрите http://rprieto.github.com/psDeploy/iis-6-cmdlets.html