Добавить графики непосредственно в документ, используя пакет Python DOCX
Я готовлю некоторые данные и хочу автоматически сгенерировать отчет. Я могу сохранить сюжет, а затем добавить его в свой документ. Однако я предпочитаю делать это напрямую, без сохранения шага. Просматривая документацию по python-docx, я сомневаюсь, что это выполнимо этим пакетом. Есть ли другой способ?
Мой код выглядит так прямо сейчас
from docx import Document
from docx.shared import Inches
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.savefig('test.png')
document = Document()
document.add_heading('Report',0)
document.add_picture('test.png', width=Inches(1.25))
document.save('report.docx')
3 ответа
Используйте StringIO:
Этот модуль реализует файловый класс StringIO, который читает и записывает строковый буфер (также известный как файлы памяти).
from docx import Document
from docx.shared import Inches
import matplotlib.pyplot as plt
import numpy as np
from pandas.compat import StringIO
memfile = StringIO()
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.savefig(memfile)
document = Document()
document.add_heading('Report',0)
document.add_picture(memfile, width=Inches(1.25))
document.save('report.docx')
memfile.close()
Python 3: https://docs.python.org/3/library/io.html
Python 2: https://docs.python.org/2/library/stringio.html
Или используйте StringIO из pandas.compat
Попробуйте код ниже в Python 3, чтобы напрямую сохранить график в документе.
from docx import Document
from docx.shared import Inches
import matplotlib.pyplot as plt
import numpy as np
from pandas.compat import BytesIO
memfile = BytesIO()
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.savefig(memfile)
document = Document()
document.add_heading('Report',0)
document.add_picture(memfile, width=Inches(1.25))
document.save('report.docx')
memfile.close()
Вы можете использоватьdocxtpl
и использоватьjinja
шаблоны для размещения диаграмм.