Microsoft Office编程 (一)

1.简介

通过使用Python进行COM客户端编程,从而能够控制诸如Word、Excel、PowerPoint和Outlook等Microsoft Office应用,并能够与之通信。COM是一个服务,通过该服务可以使用PC应用与其他应用进行交互。

传统意义上,COM客户端一般使用VB/VBC和C++两种不同的工具来编写。对于COM编程而言,Python一般被视为一种可行的替代品,因为它比VB更加强大,又比C++开发有更好的表现力和更少的时间消耗。

2.使用Python进行COM客户端编程

  • 交互的基本步骤

  1. 启动应用
  2. 添加合适的文档以工作(或载入一个已经存在的文档)
  3. 使应用可见
  4. 执行文档所需的所有工作
  5. 保存或放弃文档
  6. 退出
  • Excel

摘自:python核心编程(第三版)

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import Tk
import time
from tkinter.messagebox import showwarning
import win32com.client as win32

#匿名函数,相当于
'''
def warn(app):
    showwarning(app,'Exit?') 
'''
warn=lambda app:showwarning(app,'Exit?')
RANGE=range(3,8)
def excel():
    app='Excel'
    '''
    静态调动,PythonWin运行Makepy工具,创建应用所需的对象
    动态调动代码:x1=win32.Dispatch('{0}.Application'.format(app))
    '''
    x1=win32.gencache.EnsureDispatch('{0}.Application'.format(app))
    #新建一个sheet
    ss=x1.Workbooks.Add()
    #激活sheet
    sh=ss.ActiveSheet
    #设置桌面上可见
    x1.Visible=True
    time.sleep(1)
    #设置单元格(1,1)的值
    sh.Cells(1,1).Value='Python-to-{0} Demo'.format(app)
    time.sleep(1)
    for i in RANGE:
        sh.Cells(i,1).Value='Line {0}'.format(i)
        time.sleep(1)
    sh.Cells(i+2,1).Value="Th-th-th-that's all folks!"
    #调用匿名函数
    warn(app)
    #退出不保存
    ss.Close(False)
    x1.Application.Quit()

if __name__ == '__main__':
    #新建Tk对象,并绘画
    Tk().withdraw()
    excel()
  • Word

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import Tk
import time
from tkinter.messagebox import showwarning
import win32com.client as win32

#匿名函数,相当于
'''
def warn(app):
    showwarning(app,'Exit?') 
'''
warn=lambda app:showwarning(app,'Exit?')
RANGE=range(3,8)
def word():
    app='Word'
    '''
    静态调动,PythonWin运行Makepy工具,创建应用所需的对象
    动态调动代码:x1=win32.Dispatch('{0}.Application'.format(app))
    '''
    word=win32.gencache.EnsureDispatch('{0}.Application'.format(app))
    #新建一个doc
    doc=word.Documents.Add()
    #设置桌面上可见
    word.Visible=True
    time.sleep(1)
    #创建Range对象,标识文章开始的起点和终点
    rng=doc.Range(0,0)
    #插入数据
    rng.InsertAfter('Python-to-{0} Test\r\n\r\n'.format(app))
    time.sleep(1)
    for i in RANGE:
        rng.InsertAfter('Line {0}\r\n'.format(i))
        time.sleep(1)
    rng.InsertAfter("\r\nTh-th-th-that's all folks!\r\n")
    #调用匿名函数
    warn(app)
    #退出不保存
    doc.Close(False)
    word.Application.Quit()

if __name__ == '__main__':
    #新建Tk对象,并绘画
    Tk().withdraw()
    word()
  • PowerPoint

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import Tk
import time
from tkinter.messagebox import showwarning
import win32com.client as win32

#匿名函数,相当于
'''
def warn(app):
    showwarning(app,'Exit?') 
'''
warn=lambda app:showwarning(app,'Exit?')
RANGE=range(3,8)
def ppoint():
    app='PowerPoint'
    '''
    静态调动,PythonWin运行Makepy工具,创建应用所需的对象
    动态调动代码:x1=win32.Dispatch('{0}.Application'.format(app))
    '''
    ppoint=win32.gencache.EnsureDispatch('{0}.Application'.format(app))
    #创建一个新的演示文稿
    pres=ppoint.Presentations.Add()
    #设置桌面上可见
    ppoint.Visible=True
    #创建一张幻灯片
    s1=pres.Slides.Add(1,win32.constants.ppLayoutText)
    time.sleep(1)
    '''
    ps:因为python3以后的版本改变了dict.keys的返回值,返回的是dict_keys对象,不支持索引值
    所以s1a=s1.Shapes[0].TextFrame.TextRange改为
        s1a=list(s1.Shapes)[0].TextFrame.TextRange
    '''
    #shape[0]代表ppLayoutTitle,即幻灯片的title
    s1a=list(s1.Shapes)[0].TextFrame.TextRange
    s1a.Text='Python-to-{0} Demo'.format(app)
    time.sleep(1)
    #shape[1]代表ppLayoutText,即幻灯片的Text
    s1b = list(s1.Shapes)[1].TextFrame.TextRange
    for i in RANGE:
        s1b.InsertAfter('Line {0}\r\n'.format(i))
        time.sleep(1)
    s1b.InsertAfter("\r\nTh-th-th-that's all folks!")
    #调用匿名函数
    warn(app)
    #退出不保存
    pres.Close()
    ppoint.Quit()

if __name__ == '__main__':
    #新建Tk对象,并绘画
    Tk().withdraw()
    ppoint()
  • Outlook

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import Tk
import time
from tkinter.messagebox import showwarning
import win32com.client as win32

#匿名函数,相当于
'''
def warn(app):
    showwarning(app,'Exit?') 
'''
warn=lambda app:showwarning(app,'Exit?')
RANGE=range(3,8)
def outlook():
    app='Outlook'
    '''
    静态调动,PythonWin运行Makepy工具,创建应用所需的对象
    动态调动代码:x1=win32.Dispatch('{0}.Application'.format(app))
    '''
    olook=win32.gencache.EnsureDispatch('{0}.Application'.format(app))
    #创建一封邮箱
    mail=olook.CreateItem(win32.constants.olMailItem)
    #接收方
    recip=mail.Recipients.Add('[email protected]')
    #邮件主题
    subj=mail.Subject='Python-to-{0} Demo'.format(app)
    #设置邮件正文内容
    body=['Line {0}'.format(i) for i in RANGE]
    body.insert(0,'{0}\r\n'.format(subj))
    body.append("\r\nTh-th-th-that's all folks!")
    mail.body='\r\n'.join(body)
    #发送邮件
    mail.send()
    ns=olook.GetNamespace("MAPI")
    obox=ns.GetDefaultFolder(win32.constants.olFolderOutbox)
    obox.Display()
    obox.Items.Item(1).Display()

    #调用匿名函数
    warn(app)
    #退出不保存
    olook.Quit()

if __name__ == '__main__':
    #新建Tk对象,并绘画
    Tk().withdraw()
    outlook()

你可能感兴趣的:(Microsoft Office编程 (一))