标签: win32com

无法使用 Python 打开 Visio 文档

我正在尝试使用 Python 在 Visio 中进行一些自动化操作。我可以打开 Visio 应用程序并创建新文档,但无法打开现有文档。这是我正在尝试的代码。

  import win32com.client

  visio = win32com.client.Dispatch("Visio.Application")  # this works
  doc = visio.Documents.Open("C:\Users\username\test.vsd") # nope
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<COMObject <unknown>>", line 3, in OpenEx
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft Visio', u'\n\nFile not found.', None, 0, -2032465466), None)
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用 visio.Documents.OpenEx 并得到相同的答案。有什么想法吗?

python visio pywin32 win32com

2
推荐指数
1
解决办法
2922
查看次数

使用 Python 自动比较 Word 文档

我正在尝试使用 win32com(pywin32) 和Microsoft Word 的对象模型来比较两个 Word 文档(在“审阅”->“比较”下自动执行比较 Microsoft Word 中的两个文档的任务)。以下是我为此编写的代码:

import win32com.client
Application=win32com.client.gencache.EnsureDispatch("Word.Application")
Document=Application.Documents.Add()
Application.CompareDocuments("Original.docx","Revised.docx")
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Traceback (most recent call lastFile "<pyshell#9>", line 1, in <module>
Application.CompareDocuments("Original.docx","Revised.docx")

File "C:\Python36\lib\site-packages\win32com\gen_py\00020905-0000-0000-C000-000000000046x0x8x6\_Application.py", line 79, in CompareDocuments
, CompareFields, CompareComments, CompareMoves, RevisedAuthor, IgnoreAllComparisonWarnings

File "C:\Python36\lib\site-packages\win32com\client\__init__.py", line 466, in _ApplyTypes_
return self._get_good_object_(self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),user, resultCLSID)

TypeError: The Python instance can not be converted to a COM object   
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么会抛出这个错误。我真的很想解决这个问题。请帮忙。

提前致谢

python ms-word pywin32 win32com

2
推荐指数
1
解决办法
1万
查看次数

Python通过win32com向Outlook任务添加超链接

我想在通过 win32com 创建的任务正文中创建一个超链接。

到目前为止,这是我的代码:

outlook = win32com.client.Dispatch("Outlook.Application")
outlook_task_item = 3
recipient = "my_email@site.com"
task = outlook.CreateItem(outlook_task_item)
task.Subject = "hello world"
task.Body = "please update the file here"
task.DueDate = dt.datetime.today()
task.ReminderTime = dt.datetime.today()
task.ReminderSet = True
task.Save()
Run Code Online (Sandbox Code Playgroud)

我尝试设置该属性task.HTMLBody,但收到错误:

AttributeError: Property 'CreateItem.HTMLBody' can not be set.
Run Code Online (Sandbox Code Playgroud)

我也尝试过

task.Body = "Here is the <a href='http://www.python.org'>link</a> I need"
Run Code Online (Sandbox Code Playgroud)

但我没有得到正确的超链接。

但是,如果我在 Outlook 中创建任务前端,我就可以添加超链接。

python outlook win32com

2
推荐指数
1
解决办法
4456
查看次数

Win32 鼠标点击

所以,这是我现在的代码:

import win32, win32com

def leftClick():
    win32api.mouse_event(win32com.MOUSEEVENTF_LEFTDOWN,0,0)
    time.sleep(.1)
    win32api.mouse_event(MOUSEEVENTF_LEFTUP,0,0)
    print('Left Click')
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,这就是我得到的:

win32api.mouse_event(win32com.MOUSEEVENTF_LEFTDOWN,0,0) AttributeError: 模块“win32com”没有属性“MOUSEEVENTF_LEFTDOWN”

知道为什么吗?顺便说一句,我正在运行 Python 3.7。

winapi pywin32 mouseevent win32com python-3.x

2
推荐指数
1
解决办法
2万
查看次数

win32com 获取可用应用程序列表

有一个很好的构造,允许控制 win32com 对象,比如

win32com.client.Dispatch('Word.Application')
win32com.client.Dispatch('Excel.Application')
Run Code Online (Sandbox Code Playgroud)

...等有没有办法获得可用应用程序的完整列表(*.Application)?

更新。通过扫描注册表项 HKEY_CLASSES_ROOT 获取 CLSID 条目的可能解决方案。

from collections import OrderedDict
def myScan():

    result = OrderedDict(); i = 0
    while True:
        try:
            a1 = winreg.OpenKey(aReg, winreg.EnumKey(winreg.HKEY_CLASSES_ROOT, i))
            if i%1000==0:
                print(i,'processing')
            j = 0
            while True:
                try:
                    #print(j)
                    a2 = winreg.EnumKey(a1,j)
                    if a2=='CLSID':
                        kkkey = winreg.EnumKey(winreg.HKEY_CLASSES_ROOT,i)
                        vvvalue = winreg.EnumValue(winreg.OpenKey(a1,a2),0)
                        result[kkkey] = vvvalue
                        break
                    j+=1
                except OSError:
                    break
            i+=1
        except OSError:
            break
    return result

result = myScan() #candidates
print(len(res)) # 3363
keys_ = list(result.keys())
#retrieving part of result …
Run Code Online (Sandbox Code Playgroud)

python win32com

2
推荐指数
1
解决办法
4731
查看次数

win32com 库在 Linux 上可用吗?

我想在 Linux 上使用 win32com.client 模块。那么使用上有什么问题吗?

linux win32com

2
推荐指数
1
解决办法
4440
查看次数

Python 通过函数向电子邮件添加附件

我正在尝试从 Python 自动发送附件和电子邮件:

def Emailer(text, subject, recipient):
    import win32com.client as win32   
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.HtmlBody = text
    mail.Display(True)
    attachment = 'C:/Users/.../file.pdf'
    mail.Attachments.Add(attachment)

Emailer('text', 'test', 'name@mail.com')
Run Code Online (Sandbox Code Playgroud)

但是,这不会添加附件。路径应该是正确的,因为当我在下面尝试时,它有效:

import win32com.client as win32
mail = win32.Dispatch('outlook.application').CreateItem(0)
mail.To = 'name@mail.com'
mail.Subject = 'test'
mail.HTMLBody = 'text'

attachment  = 'C:/Users/.../file.pdf'
mail.Attachments.Add(attachment)
mail.Display(True)
Run Code Online (Sandbox Code Playgroud)

任何人都知道我做错了什么Emailer()

python outlook win32com

2
推荐指数
1
解决办法
3298
查看次数

Solidworks 宏实现不适用于 Python

我有一个宏(见下文),它将使用 xyz 点从.txt文件加载到 Solidworks 中。需要明确的是,这给出了所需的输出。

Dim swApp As Object
Dim Part As Object

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
Part.InsertCurveFile("Generic Filepath\Points.txt")

End Sub
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用此实现从 Python 运行相同的宏:

import win32com.client

sldw = win32com.client.Dispatch('SldWorks.Application')
sldw.NewDocument("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\english\Tutorial\part.prdot", 0, 0, 0)  

Part = sldw.ActiveDoc
Part.InsertCurveFile("Generic Filepath\Points.txt")  

#Cleanup the com reference. 
del sldw
Run Code Online (Sandbox Code Playgroud)

我知道我可以从 Python 运行 Solidworks 宏,因为我有一些测试可以工作。当我运行宏时,Python 不会输出任何类型的错误消息,也不会在 Solidworks 中生成任何内容。

在编辑器行中逐行运行 Python 代码Part.InsertCurveFile("Generic Filepath\Points.txt")返回False.

打开 Solidworks …

vba solidworks win32com python-3.x

2
推荐指数
1
解决办法
571
查看次数

使用 Python 从 Outlook 发送电子邮件不起作用

我已经运行一些代码一段时间了,这些代码使用 win32com.client 自动发送一些电子邮件。一切都已经工作了几个月,但今天我收到了一个错误。

import win32com.client

olMailItem = 0
obj = win32com.client.Dispatch("Outlook.Application")
newMail = obj.CreateItem(olMailItem)
Run Code Online (Sandbox Code Playgroud)

今天我收到错误AttributeError: module 'win32com.gen_py.00062FFF-0000-0000-C000-000000000046x0x9x6' has no attribute 'CLSIDToPackageMap'

如果我尝试“Excel.Application”或“Word.Application”,则不会收到错误,并且 Outlook 已安装并在我的系统上运行。上周我遇到了 mail.Bcc 和 mail.HTMLbody 分别更改为 mail.BCC 和 mail.HTMLBody 的问题,但我没有发现字符串的更改有帮助。

任何人都可以阐明可能发生的事情吗?

提前致谢。

pywin32 win32gui win32com python-3.x

2
推荐指数
1
解决办法
5843
查看次数

使用 Python 发送 Outlook 电子邮件的方法差异

我是 Python 新手,最近尝试了两种在 Outlook 365 上自动发送电子邮件的方法,其中一种比另一种更成功。我想问一下主要的区别是什么,因为它们看起来差别很大。

第一种方法本质上是《自动化无聊的东西》一书中概述的方法,使用 SMTP 或 IMAP。我尝试了这个,但没有让它工作,可能是因为使用办公室计算机的身份验证问题。

第二种方法对我有用,不涉及身份验证,我只需导入 win32com 客户端和以下代码:

outlook = client.Dispatch('Outlook.Application')
message = outlook.CreateItem(0)
message.Display() 
message.To = "redacted"
message.CC = "redacted"
message.Subject = "Hello"
Run Code Online (Sandbox Code Playgroud)

我想问一下这两种方法的主要区别是什么。似乎第二个可能依赖于 Outlook 打开和我登录,但如果我的计算机进入睡眠状态,第一个也可以工作吗?

当我已经登录到 Windows 并无需输入用户 ID 和密码即可访问 Outlook 时,为什么还要采用涉及身份验证的第一种方法?

我认为这个问题对于其他刚接触 Python 和电子邮件自动化的人来说可能有用,因为他们在寻找解决方案时也可能会遇到这两种方法。

python outlook smtp win32com

2
推荐指数
1
解决办法
4339
查看次数