我正在尝试将Outlook电子邮件收到的html表格粘贴到新的Excel电子表格中,但我得到了一个“pywintypes.com_error”。寻求一种更加pythonic的方式在电子邮件正文中执行相当于“Control + A”的操作并粘贴到新的电子表格中。
相关的代码片段是:
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# Select main Inbox
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
try:
for message in messages:
try:
if message.subject == 'myemailed Report':
print('Sender:' , message.sender)
print(message.subject)
mailItem = message.HTMLBody # <----Attempting to copy the body of the selected email.
# Start an instance of Excel
Xlsx = win32com.client.Dispatch("Excel.Application")
# Prevent Excel from asking questions.
Xlsx.DisplayAlerts = True # will change to False
Xlsx.Visible = True # will change to False
# Create a new Excel Workbook
workbook = Xlsx.Workbooks.Add()
ws = workbook.Sheets("Sheet1")
ws.Range('a7').select
ws.Paste(mailItem) # <--------------- Generates Error
workbook.SaveAs(mydesktop+'UpdatedSheet.xlsx')
# Quit Excel
Xlsx.Quit()
except:
x=1
except:
x=1
我收到一条消息:Traceback(最近一次调用最后一次):文件“”,第1行,在ws.Paste(mailItem)文件“>”,第3行,在粘贴pywintypes.com_error:( - 21470352567,'异常发生'。 ,(0,'Microsoft Excel','工作表类的粘贴方法失败','xlmain11.chm',0,-2146827284),无)
有没有更好的办法?感谢帮助!
ws.Paste(mailItem)是问题的主要部分。代码应该是:
ws.Paste()
但是 - 复制电子邮件正文就好像点击“Ctrl-A”更复杂,并且有很多答案。我设法得到了以下工作,但我不知道为什么会这样。
我使用了导入pyperclip,它需要pip install pyperclip,以及以下代码:
import pyperclip
def copy(text):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
def paste():
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
return data
然后......
mailItem = message.HTMLBody
pyperclip.copy(mailItem)
# Start an instance of Excel
Xlsx = win32com.client.Dispatch("Excel.Application")
# Create a new Excel Workbook
workbook = Xlsx.Workbooks.Add()
ws = workbook.Sheets("Sheet1")
ws.Range('a1').select
ws.Paste()
ws.Range('a1').select
workbook.SaveAs(myexcel.xlsx')
我试着这样做而不使用pyperclip,但是两个def的组合在开头和ws.Paste()都有效。