如何将Outlook电子邮件正文文本保存到Excel

时间:2019-12-10 12:32:13

标签: python excel outlook

我是Python的新手,正在我的一个小型项目中寻求一些帮助,该项目试图使工作中的某些任务自动化。

我每天都会收到一封电子邮件,其中包含数据。我将对电子邮件正文执行CTRL + A,CTRL + C,然后在Excel xlsv文件中执行CTRL + A,CTRL + V。

我尝试了以下代码,并成功完成了(i)搜索该特定电子邮件,(ii)在输出中显示电子邮件正文。但是,我在将输出保存到excel时遇到了问题。当我尝试下面的代码时,我只设法将输出保存到一个单元格中。

如何保存输出,以便以正确的格式等显示输出?

Outlook电子邮件示例

Report Date 10 Dec 2019
Transaction Date 9 Dec 2019
    *-   Blank Row  -*
Column 1 Column 2 Column 3 Column 4 Column 5 Column 6
Data 1 Data 2 Data 3 Data 4 *blank* Data 6

我需要将输出以这种格式保存为Excel xlsv

[Report Date]      [10 Dec 2019]
[Transaction Date] [9 Dec 2019]
- Blank row in Excel xlsv -
[Column 1][Column 2][Column 3][Column 4][Column 5]   [Column 6]
[Data 1]  [Data 2]  [Data 3]  [Date 4]  [blank cell] [Data 6]
import datetime
import win32com.client
from openpyxl import workbook
from openpyxl import load_workbook

today = datetime.date.today()
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
finalfolder = outlook.getDefaultFolder(6).Folders("Final Folder")

def savemessage(subject):
    for message in messages:
        if message.Subject.find(subject) >= 0 and message.Unread and message.Senton.date() == today or \
        message.Subject.find(subject) >= 0 and message.Senton.date() == today:
            body_content = message.body
            print(body_content)
            wb = load_workbook("EXCEL XLSX")
            sheets = wb.sheetnames
            Sheet1 = wb[sheets[0]]
            Sheet1.cell(row = 1, column = 1).value = body_content
            wb.save("EXCEL XLSX")
            if message.Subject.find(subject) >= 0 and message.Unread and message.Senton.date() == today:
                message.Unread = False
                message.move(finalfolder)
            elif message.Subject.find(subject) >= 0 and message.Senton.date() == today:
                message.move(finalfolder)
                break

savemessage("SPECIFIC E-MAIL SUBJECT")

2 个答案:

答案 0 :(得分:0)

我认为您遇到的问题来自Sheet1.cell(row = 1, column = 1).value = body_content。您可以尝试遍历吗?

此外,您可以尝试使用csv。当我写到csv时,它会进入Excel文件,并且比我使用openpxyl时要好得多。

例如:

import csv
     strFile = r'C:\users\username\Desktop\csvfilename.csv'
        f = open(strFile, "w")
        csvwriter = csv.writer(f)
        try: 
            if os.path.isfile(strFile):
                os.remove(strFile)
        except PermissionError:
            pass
        head = ['[Report Date]', '[10 Dec 2019]']
        csvwriter.writerow(head)
        for row in messages():
            csvwriter.writerow(row)

答案 1 :(得分:0)

如上所述,您将所有内容粘贴到一个单元格中。当然,一切都存在,因为Excel中的单元格可以解释新行(通过按ALT + ENTER,您可以在excel单元格中创建新行)

一种描述的方法,您可以使用csv,我也会这样做。如果您真的想在此处使用excel,请使用一个有效的示例:

msg = "Report Date 10 Dec 2019 \r\n" +\
        "Transaction Date 9 Dec 2019 \r\n"+ \
        "*-   Blank Row  -* \r\n" +\
        "Column1 Column2 Column3 Column4 Column5 Column6 \r\n"+\
        "Data1 Data2 Data3 Data4 *blank* Data6 \r\n"

filename = "excel.xlsx"
wb = load_workbook(filename)
sheets = wb.sheetnames
Sheet1 = wb[sheets[0]]
for line_index, line in enumerate(msg.split("\r\n")):
    if line_index == 0:
        Sheet1.cell(row=1, column=1).value = "Report Date"
        Sheet1.cell(row=1, column=2).value = " ".join(line.split(" ")[2:])
    elif line_index == 1:
        Sheet1.cell(row=2, column=1).value = "Transaction Date"
        Sheet1.cell(row=2, column=2).value = " ".join(line.split(" ")[2:])
    elif line.lstrip().startswith("*"):
        continue
    else:
        for cell_index, cell in enumerate(line.split(" ")):
            if cell.startswith("*"):
                cell=""
            Sheet1.cell(row=line_index+1,column=cell_index+1).value = cell
wb.save(filename)

与您提供的示例一起使用。如您所见,您必须定义splitting参数。我选择\r\n作为新行(作为Windows的标准配置(假设您正在使用,否则必须进行更改)),并且作为单元格分隔符,我使用空白。如果您使用其他东西(例如制表符\t进行相应更改)。请谨慎选择,因为按照我的假设,您的数据看起来不像我一样,因为您需要某种分隔符。

同样,我假设如果a以*(或单元格)开头,则始终是空白行/单元格(这就是为什么continue用于跳过一行而不执行任何操作的原因。

我还假设,除了日期外,标头从不更改(line_index = 0和line_index = 1)。

希望对您有帮助。