Диаграммы из Excel в PowerPoint с Python

У меня есть книга Excel, созданная с использованием отличного модуля «xlsxwriter». В этой книге около 200 встроенных диаграмм. Сейчас я пытаюсь экспортировать все эти диаграммы в несколько презентаций Power Point. В идеале я хочу сохранить исходный формат и встроенные данные без ссылки на внешнюю рабочую книгу Excel.

Я уверен, что есть способ сделать это с помощью VBA. Но мне было интересно, есть ли способ сделать это с помощью Python. Есть ли способ поместить объекты диаграммы xlsxwriter в powerpoints?

Я просмотрел python-pptx и ничего не могу найти о получении диаграмм или рядов данных из рабочей книги Excel.

Любая помощь приветствуется!


person nyan314sn    schedule 17.09.2015    source источник
comment
Вы можете попробовать OprnPyXl, чтобы прочитать диаграмму из файла Excel, который, я считаю, он поддерживает, записать в буфер файла, а затем добавить в PowerPoint. РЕДАКТИРОВАТЬ: 0penPyXl по-прежнему не поддерживает чтение диаграмм, поэтому я сомневаюсь, что это возможно в python.   -  person Alexander Huszagh    schedule 18.09.2015
comment
попробуйте www.pptxbuilder.com   -  person Boosted_d16    schedule 13.05.2019


Ответы (3)


Потратив часы на попытки пробовать разные вещи, я нашел решение этой проблемы. Надеюсь, это поможет кому-то сэкономить время. Следующий код скопирует все диаграммы из «workbook_with_charts.xlsx» в «Final_PowerPoint.pptx».

По какой-то причине, которую я еще не понял, она работает лучше при запуске этой программы Python с терминала CMD. Иногда он выходит из строя, если вы пытаетесь запустить это несколько раз, даже если первый запуск обычно нормальный.

Другая проблема заключается в том, что в пятой строке, если вы сделаете False с помощью «presentation = PowerPoint.Presentations.Add (False)», он не будет работать с Microsoft Office 2013, даже если и «True», и «False» по-прежнему будут работать с Microsoft Office 2010.

Было бы здорово, если бы кто-то мог прояснить эти два вопроса.

# importing the necessary libraries
import win32com.client
from win32com.client import constants

PowerPoint=win32com.client.Dispatch("PowerPoint.Application")
Excel=win32com.client.Dispatch("Excel.Application")


presentation=PowerPoint.Presentations.Add(True)
workbook=Excel.Workbooks.Open(Filename="C:\\.........\\workbook_with_charts.xlsx",ReadOnly=1,UpdateLinks=False)

for ws in workbook.Worksheets:
    for chart in ws.ChartObjects():
    # Copying all the charts from excel
        chart.Activate()
        chart.Copy()  

        Slide=presentation.Slides.Add(presentation.Slides.Count+1,constants.ppLayoutBlank)
        Slide.Shapes.PasteSpecial(constants.ppPasteShape)

    # WE are going to make the title of slide the same chart title
    # This is optional 
    textbox=Slide.Shapes.AddTextbox(1,100,100,200,300)
    textbox.TextFrame.TextRange.Text=str(chart.Chart.ChartTitle.Text)

presentation.SaveAs("C:\\...........\\Final_PowerPoint.pptx")
presentation.Close()
workbook.Close()

print 'Charts Finished Copying to Powerpoint Presentation'

Excel.Quit()
PowerPoint.Quit()
person nyan314sn    schedule 22.09.2015
comment
Я бью AttributeError: ppLayoutBlank - person R__raki__; 29.05.2019
comment
@ nyan314sn Привет! Это очень удобный пример для базового использования. Можете ли вы сказать, где вы нашли вспомогательный материал (справку, руководство, учебные пособия и т. Д.), Где объясняется код и его использование, например PowerPoint.Presentations.Add(), Slide.Shapes.PasteSpecial() или Slide.Shapes.AddTextbox()? - person Mike; 02.10.2020
comment
@Mike, после того, как вы получите базовую настройку для управления файлом Excel и / или PowerPoint из python, дополнительные сложные вещи, по сути, прибывают из руководства VBA, поскольку мы, по сути, пишем код VBA из более эффективной структуры кода Python ... например, docs.microsoft.com/en-us/office/ vba / api / или docs.microsoft.com /en-us/office/vba/api/excel.workbook - person nyan314sn; 05.10.2020
comment
@R__raki__ Привет, этот код должен решить вашу проблему: from win32com.client import constants. - person Mike; 05.10.2020

Подход, к которому я был бы склонен с текущей версией python-pptx, - это прочитать таблицы Excel для их данных и воссоздать диаграммы в python-pptx. Это, конечно, потребует знания форматирования диаграммы и т. Д., Чтобы я мог понять, почему вы, возможно, не захотите этого делать.

Импорт диаграмм непосредственно из Excel выполнялся в прошлом, см. Запрос на перенос здесь, на GitHub: https://github.com/scanny/python-pptx/pull/65

Но это потребовало большого количества операций с python-pptx и множеством его версий, так что в лучшем случае это может быть хорошим руководством к тому, какие стратегии могут сработать. Вы должны очень сильно этого хотеть, я полагаю, пойти по этому пути :)

person scanny    schedule 18.09.2015
comment
Привет, Сканни, Спасибо за ответ. Я не прочь воссоздать диаграммы с помощью python-pptx, хотя сомневаюсь, что python-pptx предлагает такой же уровень сложности с точки зрения построения диаграмм, как xlsxwriter. Кроме того, я не могу найти ни одного примера чтения данных таблицы Excel из python-pptx. Пожалуйста, поделитесь, если у вас есть. - person nyan314sn; 18.09.2015
comment
Для чтения данных Excel потребуется другой пакет. Я думал, что можно использовать xlsxwriter, так как он все равно импортирован python-pptx, но помните, что теперь он не работает для чтения. Я полагаю, это должен быть один из других пакетов Excel или, возможно, экспорт в CSV. - person scanny; 19.09.2015
comment
Привет, @scanny, есть ли составные диаграммы, горизонтальные гистограммы и диаграммы с областями, которые скоро появятся в функциях построения диаграмм python-pptx? - person vagabond; 21.11.2016
comment
@vagabond Это отдельный вопрос, возможно, лучше всего ответить на него в списке проблем python-pptx GitHub. Короткий ответ: большинство из них сейчас там. - person scanny; 21.11.2016

У меня недостаточно репутации для комментариев, но если вы столкнетесь с той же проблемой, что и @R__raki__, вы можете использовать целочисленное значение, определенное ссылкой VBA. В этом случае это будет 12.

Так что замените

Slide=presentation.Slides.Add(presentation.Slides.Count+1,constants.ppLayoutBlank)

с участием

Slide=presentation.Slides.Add(presentation.Slides.Count+1,12)

Дополнительную информацию см. здесь.

person LamerLink    schedule 29.01.2020