Python3 Win32com复制电子邮件的正文并粘贴到新的Excel文件

问题描述 投票:0回答:1

我正在尝试将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),无)

有没有更好的办法?感谢帮助!

email copy-paste win32com
1个回答
0
投票

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()都有效。

© www.soinside.com 2019 - 2024. All rights reserved.