How to choose the version of excel which win32com.client has to use in python?
For Excel 2013, you can type:
o = win32com.client.Dispatch("Excel.Application.15")
since the program is located somewhere like:
C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE
Since I do not have any other version installed, I guess it works if you just replace the 15
by the version you need. You can see the path of the binary that is launched by the command with eg. process explorer.
EDIT: This is impossible "Programmatically" :(
After having tried this:
excel15 = win32com.client.dynamic.Dispatch("Excel.Application.15")excel14 = win32com.client.dynamic.Dispatch("Excel.Application.14")
which yields objects like this:
>> print excel15<COMObject Excel.Application.15>>> print excel14<COMObject Excel.Application.14>
only one instance of Excel (14) is visible in process explorer. Doing
excel15.Visible = True
confirms that.
It turns out that using automation for controlling both versions of Excel is impossible. Checking the Registry, the programs (Excel.Application.14
and 15
) share the same CLSID. An there is only one LocalServer
per CLSID (HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer
on my computer). This LocalServer points to the last installed version, Excel14 (trial) on my computer. This is the only object created by the Dispatch
call.
All this is explained here (ยง "Using Automation to Control Microsoft Excel").
There is hope
As I said, this LocalServer
points to the last installed version. There is hence a chance you can achieve what you want:
- either you feel confident to change the registry by hand. I would say "easy" (change the application pointed by
LocalServer
, and the default application of theExcel.Application
entry), but I will prefer the following simple solution - reinstall the 2007 application (of course, if you can). This is a poor/inelegant yet simple fix.
The following should work since I have tested it although not with two versions of Excel simultaneous installed but instead forcing Excel files to open up in Word (aka WINWORD.exe). Replace the path to whichever version of Excel you want to be used:
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"
Save the above reg
script after replacing C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE
with the path to the actual EXCEL.exe
you'd like to use as default(be careful with the \\
s), in a you_name_it.reg
and run/merge/double-click it. It will ask you for confirmation, give it an affirmative and check.
I have not tried this, but perhaps you could launch the Excel version you want using something like
desired_excel_path = 'C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE'file_path = 'C:\\myfile.xlsx'subprocess.call([desired_excel_path , file_path])
(or whatever is the subprocess method of launching Excel manually that works) and thereafter try
wb = win32com.client.GetObject(file_path)
to obtain the running instance.