Как выбрать версию excel, которую win32com.client должен использовать в python?

У меня есть файл excel 2007 (*. xlsx), который должен быть открыт через python script. Но проблема в том, что у меня две версии MS office (2003 и 2007), установленные на моем компьютере. Хотя я пытался сделать Excel 2007 в качестве приложения по умолчанию для открытия файлов xlsx, win32com.client пытается открыть файл xlsx с помощью Excel 2003. Также это возвращает Excel 2003 в качестве приложения по умолчанию.

Есть ли способ заставить win32com.client выбрать Excel 2007 для открытия файлов xlsx?

Ответ 1

В Excel 2013 вы можете ввести:

o = win32com.client.Dispatch("Excel.Application.15")

так как программа находится где-то вроде:

C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE 

Так как у меня нет какой-либо другой версии, я думаю, она работает, если вы просто замените 15 на нужную вам версию. Вы можете увидеть путь двоичного файла, который запускается командой, например. проводник процессов.

EDIT: это невозможно "программно": (

Попробовав это:

excel15 = win32com.client.dynamic.Dispatch("Excel.Application.15")
excel14 = win32com.client.dynamic.Dispatch("Excel.Application.14")

который дает такие объекты:

>> print excel15
<COMObject Excel.Application.15>
>> print excel14
<COMObject Excel.Application.14>

только один экземпляр Excel (14) отображается в проводнике процессов. Выполнение

excel15.Visible = True

подтверждает это.

Оказывается, использование автоматизации для управления обеими версиями Excel невозможно. При проверке реестра программы (Excel.Application.14 и 15) используют один и тот же CLSID. Существует только один LocalServer за CLSID (HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer на моем компьютере). Этот LocalServer указывает на последнюю установленную версию Excel14 (пробная версия) на моем компьютере. Это единственный объект, созданный вызовом Dispatch.

Все это объясняется здесь (§ "Использование автоматизации для управления Microsoft Excel" ).

Есть надежда

Как я уже сказал, этот LocalServer указывает на последнюю установленную версию. Следовательно, вы можете достичь того, чего хотите:

  • либо вы уверены, что вручную измените реестр. Я бы сказал "легко" (измените приложение, на которое указывает LocalServer, и приложение по умолчанию для записи Excel.Application), но я предпочту следующее следующее решение:
  • переустановите приложение 2007 (конечно, если можно). Это плохое/неэлегантное, но простое исправление.

Ответ 2

Следующее должно работать с тех пор, как я его протестировал, хотя не с одновременной установкой двух версий Excel, а вместо этого форсирование файлов Excel для открытия в Word (aka WINWORD.exe). Замените путь на любую версию Excel, которую вы хотите использовать:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.xlsx]
"Content Type"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
@="Excel.Sheet.Custom"
"PerceivedType"="document"

[HKEY_CLASSES_ROOT\.xlsx\Excel.Sheet.Custom]

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open]
@="&Open"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE\" /dde"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec\application]
@="Excel"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec\topic]
@="system"

Сохраните выше reg script после замены C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE на путь к фактическому EXCEL.exe, который вы хотите использовать по умолчанию (будьте осторожны с \\ s), в you_name_it.reg и запустить/объединить/дважды щелкнуть по нему. Он попросит вас подтвердить, дать ему подтверждение и проверить.

Ответ 3

Я не пробовал это, но, возможно, вы могли бы запустить версию Excel, которую хотите использовать, например,

desired_excel_path = 'C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE'
file_path = 'C:\\myfile.xlsx'

subprocess.call([desired_excel_path , file_path])

(или что-то вроде метода подпроцесса запуска Excel вручную) и после этого попробуйте

wb = win32com.client.GetObject(file_path) 

чтобы получить исполняемый экземпляр.

Ответ 4

Вы пытались загрузить модуль через EnsureModule?
Использование:

from win32com.client import gencache
mod = gencache.EnsureModule('clsID', 'lcID','versionMajor', 'versionMinor')

И вы можете получить все, что нужно от python makepy.py -i, доступных в папке lib/site-packages/win32com/client
Он откроет окно, в котором вы можете выбрать нужное приложение. Вы найдете там обе версии Excell, выберите нужный, и он вернется, как подключить его к python.



Отсюда у вас будет два варианта.
1) excel = mod.Application должен предоставить вам диспетчеризацию приложения, но вы не сможете увидеть из него атрибуты (но версия должна быть правильной, а команды должны работать как обычно).

2) excel = win32com.client.Dispatch("Excel.Application") должен использовать только что сгенерированный модуль (но я не уверен, что это сработает и принесет правильную версию!).