如何使用Python为Excel的每一行创建新的Outlook电子邮件

如何使用Python为Excel的每一行创建新的Outlook电子邮件,python,excel,openpyxl,Python,Excel,Openpyxl,我正在尝试使用Excel工作表填充Outlook电子邮件草稿,并让每一新行创建一封新电子邮件。我正试图使用openpyxl库来实现这一点。 Excel文件看起来像这样。 我尝试使用列表理解对每一行进行迭代,但结果基本相同,我收到一封包含第一行数据的电子邮件,但其余信息未被使用。我现在使用这些信息的唯一方法是自己更改行偏移量,但显然,这对很多行都不起作用 我使用以下函数从Excel文件中获取信息 def get_info(): 从第2行开始获取数据。这里可能有问题吗? 数据=获取信息() 包含E

我正在尝试使用Excel工作表填充Outlook电子邮件草稿,并让每一新行创建一封新电子邮件。我正试图使用openpyxl库来实现这一点。 Excel文件看起来像这样。

我尝试使用列表理解对每一行进行迭代,但结果基本相同,我收到一封包含第一行数据的电子邮件,但其余信息未被使用。我现在使用这些信息的唯一方法是自己更改行偏移量,但显然,这对很多行都不起作用

我使用以下函数从Excel文件中获取信息 def get_info():

从第2行开始获取数据。这里可能有问题吗? 数据=获取信息()

包含Excel文件数据的电子邮件文本正文 text=“你好,{1}!工单{0}已完成”。格式(数据[0],数据)

创建电子邮件功能 def Emailer(文本1、主题、收件人): 将win32com.client作为win32导入

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = recipient
mail.Subject = subject
mail.HtmlBody = text1
mail.Display(False)
之后,我会调用Emailer函数,比如

Emailer(文本,“已完成的WO{0}{1}”。格式(数据[0],数据),数据[2])


但是,如何使这个函数对Excel工作表的每一行都单独工作,这让我感到困惑。到目前为止,它只会一遍又一遍地写同一封电子邮件,而不会阅读其余的行。

我的建议是将每一行包装成一个对象,并将对象推到列表
信息中,如下所示:

class Recipient():
    def __init__(self, w_order, name, email):
        self.w_order = w_order
        self.name = name
        self.email = email


def get_info():

    loc = "Excel_file_location.xlsx"
    wb = load_workbook(loc)

    info = []
    ws = wb[wb.sheetnames[0]]
    ws = wb.active

    for row in range(2, 5):
        rec = Recipient("", "", "")
        for col in range(ord('A'), ord('D')):
            if chr(col) == 'A':
                rec.w_order = ws[chr(col) + str(row)].value
            elif chr(col) == 'B':
                rec.name = ws[chr(col) + str(row)].value
            elif chr(col) == 'C':
                rec.email = ws[chr(col) + str(row)].value

        info.append(rec)


    return info
从那时起,您可以通过如下循环从mail函数中的
get_info()
访问信息:

def Emailer(text1, subject, recipient): 

    import win32com.client as win3

    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.HtmlBody = text1
    mail.Display(False)

data = get_info()


for i in range(0, len(data)):
    Emailer(text, "Completed WO {0} | {1}".format(data[i].w_order, data[i].name), data[i].email)

row\u offset=1
看起来不对。这似乎有效,看起来这是正确的方法!谢谢!
class Recipient():
    def __init__(self, w_order, name, email):
        self.w_order = w_order
        self.name = name
        self.email = email


def get_info():

    loc = "Excel_file_location.xlsx"
    wb = load_workbook(loc)

    info = []
    ws = wb[wb.sheetnames[0]]
    ws = wb.active

    for row in range(2, 5):
        rec = Recipient("", "", "")
        for col in range(ord('A'), ord('D')):
            if chr(col) == 'A':
                rec.w_order = ws[chr(col) + str(row)].value
            elif chr(col) == 'B':
                rec.name = ws[chr(col) + str(row)].value
            elif chr(col) == 'C':
                rec.email = ws[chr(col) + str(row)].value

        info.append(rec)


    return info
def Emailer(text1, subject, recipient): 

    import win32com.client as win3

    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.HtmlBody = text1
    mail.Display(False)

data = get_info()


for i in range(0, len(data)):
    Emailer(text, "Completed WO {0} | {1}".format(data[i].w_order, data[i].name), data[i].email)