Как выбрать версию 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")
должен использовать только что сгенерированный модуль (но я не уверен, что это сработает и принесет правильную версию!).