我是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")
答案 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)。
希望对您有帮助。