Отправить графики в Outlook с Python - PullRequest
0 голосов
/ 10 ноября 2018

Я хотел создать лучшие автоматизированные отчеты, включая визуальные эффекты, а не только текст. Конкретным способом, которым я хотел это сделать, было обращение к outlook.application через win32com.client.

Я знаю основы отправки электронного письма, и я попытался прочитать справочник по VBA, и самым близким, что я нашел, был Просмотр объекта , но я искал возможность добавления пирога диаграммы, гистограммы и т. д.

Я знаю, через графический интерфейс, однажды в открытом сообщении, которое выскочило из приложения, вы можете Insert > Chart и выбрать нужный график для загрузки в сообщение.

Есть ли способ в API Outlook, чтобы иметь возможность использовать эти графики / диаграммы, доступные в окне Insert Chart? Или API относительно ограничен в доступных функциях по сравнению с приложением, когда дело доходит до стилизации / форматирования сообщений?

Вот простой код для создания / отправки сообщения, я хотел добавить эти визуальные эффекты в тело сообщения.

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.

1 Ответ

0 голосов
/ 14 ноября 2018

После дополнительных испытаний я понял это. Вот часть того, что я сделал с образцами данных, которые лежали вокруг. Обратите внимание на строку ch.ChartType = 5 # Pie chart, поскольку это отвечает на вопрос. Да, графики и диаграммы доступны через API, а ChartTypes можно найти здесь . Это отвечает на конкретный вопрос, а также на больший вопрос о том, как взять данные, существующие за пределами Office, и загрузить их в диаграмму для отправки через Outlook через API.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...