отправить объект диаграммы в памяти в файл Excel - PullRequest
0 голосов
/ 27 июня 2018

Извините, я новичок, поэтому, пожалуйста, будьте нежны. Есть ли способ отправить файл в памяти (созданный с использованием Matplotlib) в файл Excel? Я пытаюсь сделать это с помощью openpyxl, но не повезло. Какие-либо предложения? Спасибо!

Я взломал следующий код для создания объекта диаграммы в памяти:

import io
from PIL import Image
import matplotlib.pyplot as plt
plt.figure()
plt.plot([1, 2])
plt.title("test")
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
im = Image.open(buf)

wb = openpyxl.load_workbook('input.xlsx')
ws = wb.active


ws.add_image(im, 'A1')
wb.save('output.xlsx')

К сожалению, это привело к появлению следующего сообщения об ошибке: UnboundLocalError: локальная переменная 'rel', на которую ссылается перед присваиванием

Любые предложения будут с благодарностью. Спасибо!

Примечание: следующее работает, но неэффективно.

wb = openpyxl.load_workbook('input.xlsx')
ws = wb.active
img = openpyxl.drawing.image.Image('my_chart.png')
ws.add_image(img, 'A1')
wb.save('output.xlsx')

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

По крайней мере, начиная с версии 2.6.2 openpyxl, можно полностью вставлять образы в память, не требуя временного сохранения файла, чтобы обмануть код обработки. Проблема заключалась в том, что add_image () нужен правильный объект Image.
Вот пример рабочего кода:

import io
#from PIL import Image
import matplotlib.pyplot as plt
from openpyxl.drawing.image import Image
plt.figure()
plt.plot([1, 2])
plt.title("test")
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
#im = Image.open(buf)
im = Image(buf)
im.anchor = 'A1'
wb = openpyxl.load_workbook('input.xlsx')
ws = wb.active
ws.add_image(im)
wb.save('output.xlsx')
0 голосов
/ 06 июля 2018

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

На самом деле не менее эффективно использовать временные файлы для изображений вместо изображений в памяти, поэтому я бы посоветовал сделать это в любом случае.

...