• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
李晓否
一个不应该编程的程序员
博客园    首页    新随笔    联系   管理    订阅  订阅
9.COM编程

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\r\n' % subj)
17     body.append("\r\nTh-th-th-that's all folks!")
18     mail.Body = '\r\n'.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()

 

posted on 2017-11-05 10:02  李晓否  阅读(624)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3