我正在尝试使用 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 并得到相同的答案。有什么想法吗?
我正在尝试使用 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)
我无法理解为什么会抛出这个错误。我真的很想解决这个问题。请帮忙。
提前致谢
我想在通过 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 中创建任务前端,我就可以添加超链接。
所以,这是我现在的代码:
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。
有一个很好的构造,允许控制 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) 我想在 Linux 上使用 win32com.client 模块。那么使用上有什么问题吗?
我正在尝试从 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()
我有一个宏(见下文),它将使用 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 …
我已经运行一些代码一段时间了,这些代码使用 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 的问题,但我没有发现字符串的更改有帮助。
任何人都可以阐明可能发生的事情吗?
提前致谢。
我是 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 和电子邮件自动化的人来说可能有用,因为他们在寻找解决方案时也可能会遇到这两种方法。
win32com ×10
python ×6
pywin32 ×4
outlook ×3
python-3.x ×3
linux ×1
mouseevent ×1
ms-word ×1
smtp ×1
solidworks ×1
vba ×1
visio ×1
win32gui ×1
winapi ×1