COM编程也就是去调用WINDOWs自己所携带的应用,例如office(excel,word,ppt)等等。而python中使用就需要调用win32模块。
这个模块名是pypiwin32,直接用pip安装即可。
1 from tkinter import Tk 2 from time import sleep 3 from tkinter.messagebox import showwarning 4 import win32com.client as win32 5 6 warn = lambda app: showwarning(app, 'Exit?') 7 RANGE = list(range(3, 8)) 8 9 def excel(): 10 app = 'Excel' 11 xl = win32.gencache.EnsureDispatch('%s.Application' % app) 12 ss = xl.Workbooks.Add() #添加了一个工作簿 13 sh = ss.ActiveSheet #获取活动的那个工作簿,因为excl可能有很多的sheet 14 xl.Visible = True #设为true是为了在桌面上演示,否则就直接写完存好,无法看到过程。 15 sleep(1) 16 17 sh.Cells(1,1).Value = 'Python-to-%s Demo' % app 18 sleep(1) 19 for i in RANGE: 20 sh.Cells(i,1).Value = 'Line %d' % i 21 sleep(1) 22 sh.Cells(i+2,1).Value = "Th-th-th-that's all folks!" 23 24 warn(app) 25 ss.Close(False) 26 xl.Application.Quit() 27 28 if __name__=='__main__': 29 Tk().withdraw() 30 excel()
11行就是调用COM的代码,调用了excel应用,之后回去句柄,然后对其进行写入操作。之所以用sleep是为了看清数据挨个写进去的过程,TK是为了创建一个弹出框最后点击一下再关闭。
此处使用的是静态调度,静态和动态的区别大致就是静态是在运行之前构建好对象并且缓存,而动态则是在运行时候构建。
动态的代码是xl = win32com.client.Dispatch('%s.Application' % app)
另外一点值得一提的是python文件的后缀一般是py,但是如果后缀改为pyw,则不会弹出dos窗口,这是为了在制作界面程序时候,不让用户看到dos窗口。
word和ppt的代码就不赘述了,我在贴一个outlook的代码来对比一下使用。
1 from tkinter import Tk 2 from tkinter.messagebox import showwarning 3 import win32com.client as win32 4 5 warn = lambda app: showwarning(app, 'Exit?') 6 RANGE = list(range(3, 8)) 7 8 def outlook(): 9 app = 'Outlook' 10 olook = win32.gencache.EnsureDispatch('%s.Application' % app) 11 12 mail = olook.CreateItem(win32.constants.olMailItem) 13 recip = mail.Recipients.Add('you@127.0.0.1') 14 subj = mail.Subject = 'Python-to-%s Demo' % app 15 body = ["Line %d" % i for i in RANGE] 16 body.insert(0, '%s ' % subj) 17 body.append(" Th-th-th-that's all folks!") 18 mail.Body = ' '.join(body) 19 mail.Send() 20 21 ns = olook.GetNamespace("MAPI") 22 obox = ns.GetDefaultFolder(win32.constants.olFolderOutbox) 23 obox.Display() 24 obox.Items.Item(1).Display() 25 26 warn(app) 27 olook.Quit() 28 29 if __name__=='__main__': 30 Tk().withdraw() 31 outlook()