Как я могу запустить конкретную версию Excel в автоматизации автоматизации? - PullRequest
2 голосов
/ 18 января 2009

Я использую Excel через COM-автоматизацию (в c #), но, похоже, проблема не в том, какая версия Excel запускается на коробке - мы используем как Excel 9, так и Excel 11, и для одного конкретного набора электронных таблиц требуется Excel 9 иначе они не будут работать.

Я включил ссылки на Excel 9 com, но на других машинах Excel 11 запустился. Как я могу это исправить ?

Ответы [ 6 ]

6 голосов
/ 29 апреля 2013

Это не имеет ничего общего с CurVer. Это COM. Как и во всех COM-приложениях, Windows узнает, как их запускать, обращаясь к настройкам LocalServer или InprocServer в соответствующем ключе CLSID в реестре.

CLSID для Excel:

{00024500-0000-0000-C000-000000000046}

Если вы посмотрите на этот ключ в разделе HKCR \ CLSID (HKCR \ Wow6432Node \ CLSID, если вы используете 64-разрядную версию Windows), вы увидите эти ключи. Если установлены Excel 2003 и Excel 2007, все три из этих ключей:

HKCR\Excel.Appplication
HKCR\Excel.Appplication.11
HKCR\Excel.Appplication.12

Указывает на тот же CLSID, поэтому Windows знает, как запустить только одну версию Excel.

Если вы обнаружите, что Excel 2003 запускается, потому что подключи CLSID указывают на установку OFFICE11.

Чтобы изменить это поведение, измените путь, чтобы он указывал на путь OFFICE12 (или OFFICE14). Windows будет использовать вариант команды Unicode по предпочтению (что неразборчиво). Поэтому, если вы не знаете, как обновить Unicode, просто удалите значения 'command'.

0 голосов
/ 24 апреля 2009

Чтобы получить конкретную версию Excel, вы можете запустить двоичный исполняемый файл напрямую, используя

System.Diagnostics.Process process = System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office11\Excel.exe");
int processId = process.Id;

Это даст вам идентификатор процесса Excel. Теперь вы можете подключиться к этому экземпляру Excel и получить объектную модель, вызвав AccessibleObjectFromWindow.

Этот метод требует, чтобы вы использовали P / Invoke, и вы также должны сначала получить дескриптор окна Excel. Поскольку это немного больше работы, я просто сошлюсь на следующий вопрос, где все подробно описано:

Как использовать позднюю привязку для получения экземпляра Excel?

0 голосов
/ 31 января 2009

Что говорят Руководства по идентификатору класса в прогах для Excel.Application.9 и .11 на двух разных компьютерах?

0 голосов
/ 21 января 2009

Хорошо, поэтому я проверил две машины, которые работают по-разному, после перехода на Phils предложил решение Activator. Обе машины имеют Excel.Application.9 в ключе CurVer; но один начинает 11, а другой начинает 9. Пока что я немного растерялся.

Я заметил в отладчике, что объект Type, возвращенный из Excel.Application.9, имеет некоторое свидетельство XL11 внутри.

Есть еще предложения?

0 голосов
/ 19 января 2009

Я не уверен, что ProgId (понятные имена в CLSID Guids) используется для Excel, но быстрый взгляд приводит меня к «Excel.Application», как типу, который вы можете активировать.

Посмотрите под HKEY_CLASSES_ROOT, на моей машине я вижу "Excel.Application" и "Excel.Application.12", я подозреваю, что вы активируете "Excel.Application", если вы смотрите под клавишей "CurVer" под «Excel.Application» указывает на «Excel.Application.12», проверьте это значение на ваших компьютерах репро.

Я полагаю, что вы запускаете Excel.Application. Возможно, вы захотите принудительно запустить Excel.Application.9, если на вашей целевой машине существует идентификатор программы.

Вот небольшой пример кода:

Type excel9Type = Type.GetTypeFromProgID("Excel.Application.9");
Type excelType = Type.GetTypeFromProgID("Excel.Application");

if (excelType == excel9Type)
{
    Console.WriteLine("Default Excel.Application is pointing to 'Verion 9' yay");
}
else
{
    Console.WriteLine("Excel is installed, but it's not 'Version 9'");
}

if (excel9Type == null)
{
    throw new InvalidOperationException("Excel.Application.9 is not a registered progid");
}

object excelApplication = Activator.CreateInstance(excel9Type);

// Cast excelApplication to whatever you are using as your application type. 
0 голосов
/ 19 января 2009

Эта статья может быть полезна:

http://forums.devx.com/showthread.php?p=457900#post457900

Как и вышеприведенные комментарии, мне непонятно, почему в Excel 11 возникли проблемы с электронной таблицей Excel 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...