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

时间:2019-04-29 13:55:50

标签: email copy-paste win32com

我正在尝试将Outlook电子邮件收到的html表复制粘贴到新的Excel电子表格,但出现“ pywintypes.com_error”。寻求一种更Python化的方法来在电子邮件正文上执行等同于“ 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

我收到一条消息:回溯(最近一次通话最近):   文件“”,第1行,位于     ws.Paste(mailItem)   粘贴中的文件“>”,第3行 pywintypes.com_error:(-2147352567,'发生异常。',(0,'Microsoft Excel','工作表类的粘贴方法失败','xlmain11.chm',0,-2146827284),无)

有更好的方法吗?感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

ws.Paste(mailItem)是问题的主要部分。代码应为:

// Replace the k'th byte within an int
int replace_byte(int v1 ,char v2, size_t k) 
{
   memcpy( (void*) (((char*)&v1)+k) , &v2 , sizeof(v2) );
   return v1;
}

但是-像按“ Ctrl-A”一样复制电子邮件正文要复杂得多,并且几乎有很多答案。我设法完成了以下工作,但不知道为什么会起作用。

我使用了导入pyperclip,它需要pip安装pyperclip以及以下代码:

ws.Paste()

然后稍后...

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

我尝试不使用pyperclip来执行此操作,但是起初使用两个def和ws.Paste()的组合起作用。