You get the AttributeError: __enter__ error because xl.workbooks.open is not a context manager, and so it doesn't support the with statement.
If you want to use a with statement in your code you can use the closing function from the contextlib module in the standard library, like this:
from contextlib import closing
def wb_ref(file):
xl.DisplayAlerts = False
with closing(xl.workbooks.open(file)) as wb:
wb.RefreshAll()
wb.Save()
contextlib.closing will automatically call close on the object that is passed to it when the code in the with block has completed execution.
pywin32 - Python win32com.client and "with" statement - Stack Overflow
python - List all methods in COMobject - Stack Overflow
python - What exactly does win32com.client.Dispatch("WScript.Shell")? - Stack Overflow
Win32com.client
(I've used python for a couple of years, but am no means an expert.)
I saw the Win32com package in a stackoverflow question, so I started poking around to learn more about it. It looks like you can use it to manipulate Excel and create text-to-speech. But the examples and documentation that I've found are few and far between.
I was curious to know what members of this community use Win32com for.
And are there any good tutorials/YouTube videos on how to use it?
» pip install pywin32
For those who find the accepted answer not working (look here for the reasons) - there's still a way to get objects having a _prop_map_get_ attribute (a dict that holds object's fields as keys). You just have to create the main app object with win32com.client.gencache.EnsureDispatch().
Here's a convenience function I wrote that lists fields and methods of a passed COM object created that way:
from inspect import getmembers
def print_members(obj, obj_name="placeholder_name"):
"""Print members of given COM object"""
try:
fields = list(obj._prop_map_get_.keys())
except AttributeError:
print("Object has no attribute '_prop_map_get_'")
print("Check if the initial COM object was created with"
"'win32com.client.gencache.EnsureDispatch()'")
raise
methods = [m[0] for m in getmembers(obj) if (not m[0].startswith("_")
and "clsid" not in m[0].lower())]
if len(fields) + len(methods) > 0:
print("Members of '{}' ({}):".format(obj_name, obj))
else:
raise ValueError("Object has no members to print")
print("\tFields:")
if fields:
for field in fields:
print(f"\t\t{field}")
else:
print("\t\tObject has no fields to print")
print("\tMethods:")
if methods:
for method in methods:
print(f"\t\t{method}")
else:
print("\t\tObject has no methods to print")
For an Excel object created with win32com.client.gencache.EnsureDispatch("Excel.Application") its output would be:
Members of 'Excel.Application' (Microsoft Excel):
Fields:
ActiveCell
ActiveChart
ActiveDialog
ActiveEncryptionSession
...
Workbooks
WorksheetFunction
Worksheets
_Default
Methods:
ActivateMicrosoftApp
AddChartAutoFormat
AddCustomList
Calculate
...
Union
Volatile
Wait
Just found how to get most of the methods:
Here's how:
import win32com.client
import pythoncom
ProgID = "someProgramID"
com_object = win32com.client.Dispatch(ProgID)
for key in dir(com_object):
method = getattr(com_object,key)
if str(type(method)) == "<type 'instance'>":
print key
for sub_method in dir(method):
if not sub_method.startswith("_") and not "clsid" in sub_method.lower():
print "\t"+sub_method
else:
print "\t",method
Here's a exemple output with ProgID = "Foobar2000.Application.0.7"
Output:
Playlists
Add
GetSortedTracks
GetTracks
Item
Load
Move
Remove
Save
Name
foobar2000 v1.1.13
ApplicationPath
C:\Program Files (x86)\foobar2000\foobar2000.exe
MediaLibrary
GetSortedTracks
GetTracks
Rescan
Minimized
True
Playback
FormatTitle
FormatTitleEx
Next
Pause
Previous
Random
Seek
SeekRelative
Start
Stop
ProfilePath
file://C:\Users\user\AppData\Roaming\foobar2000