使用 Python 在 Outlook 中发送图表

Send Graphs in Outlook with Python

我想通过包含视觉效果而不仅仅是文本来创建更好的自动化报告。我想做的具体方法是通过 win32com.client.

引用 outlook.application

我知道发送电子邮件的基础知识,我尝试通读 VBA 参考资料,我找到的最接近的是 View Object,但我一直在寻找的是能力添加饼图、条形图等

我通过 GUI 知道,一旦从应用程序弹出一条打开的消息,您就可以 Insert > Chart 和 select 将所需的图表加载到消息中。

在 outlook API 中有没有办法能够利用 Insert Chart window 中可用的这些 graphs/charts?或者,在消息 styling/formatting 方面,与应用程序相比,API 的可用功能是否相对有限?

这是消息的基本代码created/sent,我想将这些视觉效果添加到消息正文中。

import win32com.client as win32

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)

mail.To = 'some@name'
mail.Subject = 'Subject'
mail.Body = 'Body'
# or 
mail.HTMLBody = '<h2>HTML body</h2>' 

mail.Send()

更新

我目前正在深入研究它,但我发现 vba 应该可以满足我的需求。我也在 excel 中弄乱了一些图表对象。这是我需要理解的代码

Sub CopyAndPasteToMailBody()
    Set mailApp = CreateObject("Outlook.Application")
    Set mail = mailApp.CreateItem(olMailItem)
    mail.Display
    Set wEditor = mailApp.ActiveInspector.wordEditor
    ActiveChart.ChartArea.Copy
    wEditor.Application.Selection.Paste
End Sub

这是我拥有的一些用于创建图表对象的基本代码:

from win32com import client

excel = client.Dispatch("excel.application")
excel.Visible = True
wb = excel.Workbooks.Add()
ws = wb.Worksheets.Add()
chs = ws.ChartObjects()
co = chs.Add(0,0,500,500)

更新

下面我已经回答了如何在 Excel 中生成图表并通过 Outlook 发送它。它不是 'Outlook API',因为必须使用整个 Office。如果您像我一样因为缺少使用 win32com 与 Office 应用程序交互的文档而感到困惑,那是因为它们都在 VBA Reference 中,只需要相应地转换为 python。

经过更多的测试,我明白了。这是我用我周围的样本数据制作的一部分。请注意 ch.ChartType = 5 # Pie chart 行,因为它回答了问题。是的,可以通过 API 访问图形和图表,并且可以找到 ChartTypes here。这回答了具体问题,以及如何获取 Office 外部存在的数据并将其加载到图表中以通过 API.

通过 Outlook 发送的更大问题。
from win32com import client
from random import randint

labels  = []
ch_data = []

for x,y in _data:
    labels.append(x)
    ch_data.append(y)

_range = range(1,len(labels)+1)
l_plot = map(lambda x: 'A'+str(x),_range)
d_plot = map(lambda x: 'B'+str(x),_range)
start_end = '{}:{}'.format(l_plot[0],d_plot[-1])

excel         = client.Dispatch('excel.application')
excel.Visible = True # optional
wb            = excel.Workbooks.Add()
ws            = wb.Worksheets.Add()

cnt           = 0
for i in l_plot:
    ws.Range(i).Value = labels[cnt]
    cnt += 1

cnt           = 0
for i in d_plot:
    ws.Range(i).Value = ch_data[cnt]
    cnt += 1

chs             = ws.ChartObjects()
co              = chs.Add(100,0,250,250)
ch              = co.Chart
ch.HasTitle     = True
ch.ChartTitle.Text = 'Chart Title'
ch.ChartType    = 5 # Pie chart

series          = ch.SeriesCollection()
series.Extend(ws.Range(start_end))
co.Copy()

outlook = client.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.Display() # required to paste chart
mail.To = 'alias@email.com'
mail.Subject = 'Test Mail Item with Chart'
mail.HTMLBody = '<h3>Hello sir. This is a test</h3><br><br>'

inspector = mail.GetInspector
editor = inspector.WordEditor
editor.Select()
editor.Application.Selection.Start = editor.Application.Selection.End
editor.Application.Selection.Paste()

mail.HTMLBody += '<p>I\'m glad this is finally figured out</p>'
mail.Send()