win32com and Office

Here are some hints on using the Win32COM extensions for Python to write scripts, that use Microsoft Office Components. Thanks to Mark Hammonds excellent work, you don't need to bother with VB any longer and can automate Office from THE BEST PROGRAMMING LANGUAGE IN THE WORLD.

Code Examples

Here are some code examples for you

First Steps

Here is a very simple example:

# This line imports the Win32COM Client-side classes.
import win32com.client

# This line actually creates a Word object in memory. You should be
# able to see winword.exe in Taskmanager at this point.
word = win32com.client.Dispatch("Word.Application")

# Word is started in the background. This line brings makes its main
# (empty) window visible.
word.visible = 1

# This instruction creates a new Word document ! Yes, it *is* that easy.
doc = word.Documents.Add()

# This function writes an initial text to the document.
doc.Range().Text = "Hello, world"

The COM Makepy utility

You must run the "COM Makepy" utility from the Tools menu in Pythonwin, before you can reasonably access Office objects. It will create necessary wrapper files in the folder \python21\win32com\gen_py.

One reason to do this is, that you otherwise have to manually define keywords for constants defined in TLB files. If you use Makepy, you can access all constants defined by the office objects using

win32com.client.constants.<name>

For example, to get the default contacts folder from Outlook, you would write

f = mapi.GetDefaultFolder(win32com.client.constants.olFolderContacts)

So, which Librarys do you need to import ? For each major Office part you want to use, you need to import the specific library. These are named

Some more generic things are defined in

Unicode Strings

Strings returned from COM are normally in UNICODE. If your application is ready to deal with unicode, fine. If not, you must encode the string as "Latin-1". If you do not, and you happen to have non-7Bit-Ascii characters in any of your strings, printing will not work. For example, my top-level Outlook folders contain German Umlauts. Here is what you see in the debugger:

>>> lkn
u'Pers\xf6nliche Ordner'
>>> print lkn
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

If you want to be able to print these strings, use the following function:

DecodeUnicodeString = lambda x: codecs.latin_1_encode(x)[0]

How do I know which objects are supported ?

If you have the MSDN installed, go to

Office Developer Documentation\
	Office 2000 Documentation\
		Microsoft Office 2000 Language Reference

You can find this information online at the MSDN library. If they wouldn't change their links every two weeks, I would provide a direct link, but, alas, you'll have to lookup that yourself.