Python - 从电子邮件附件下载excel文件然后解析它

时间:2016-03-21 14:28:27

标签: python excel file outlook

编辑 - 更新 我创建了一个可怕的黑客,打开excel文件,然后使用相同的文件名将其保存下来,然后将excel文件打开到pandas中。这真的太可怕但我无法通过attachment.SaveFileAs创建和结束问题来解决问题。

我有以下代码,在我的Outlook中找到一封电子邮件然后将excel文件下载到目录。当我尝试打开文件解析它并将其用于我的脚本中的另一部分时出现格式化错误时出现问题。

我知道这是由于Python将其保存下来的方式造成的,因为当我手动执行此操作时,它可以正常工作。

非常感谢任何帮助。

from win32com.client import Dispatch
import email
import datetime as date
import pandas as pd
import os

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder("6")
all_inbox = inbox.Items
val_date = date.date.today()

sub_today = 'Hi'
att_today = 'Net - Regional.xls'

## loop through inbox attachments
for msg in all_inbox:
    yourstring = msg.Subject.encode('ascii', 'ignore').decode('ascii')
    if(yourstring.find('Regional Reporting Week') != -1):
        break

## get attachments
for att in msg.Attachments:
    if att.FileName == att_today:
        attachments = msg.Attachments
        break

attachment = attachments.Item(1)
fn = os.getcwd() + '\\' + att_today
attachment.SaveASFile(fn)

# terrible hack but workable in the short term
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.DisplayAlerts = False
excel.Visible = True
wb = excel.Workbooks.Open(fn)
wb.SaveAs(fn)
wb.Close(True)

xl = pd.ExcelFile(fn)
data_df = xl.parse("RawData - Global")
print(data_df)

1 个答案:

答案 0 :(得分:0)

att_today的文件名字符串是什么?它是否使用适当的扩展名?

您将其另存为“.xls”文件。它可能是一个“.xlsx”扩展吗?

除了“.SaveAsFile()”方法之外,您可能需要查看“.ExtractFile”或“WriteToFile”。

最后,即使Python可能保存它与手动保存它的方式不同,您仍然可以使用某些第三方Excel包正确读取文件,然后重新编写它以进行手动打开/查看。

对于“.xls”扩展,我会推荐XLRD。 对于“.xlsx”扩展,我建议使用OpenPyxl。