xlsxwriter: как загрузить png-файлы BytesIO, созданные с помощью matplotlib.pyplot - PullRequest
0 голосов
/ 01 марта 2019

python == 3.5.2, matplotlit == 3.0.0, pandas 0.24.0.numpy == 1.15.4 в windows 10.

При сохранении рисунка matplotlib с помощью savefig matplotlib и его экспорте в файл excel с помощью xlsxwriter, иногда сохранение в файл png немного отстает от экспорта в Excel, что вызываетфайл png для «не быть увиденным», следовательно, не должен быть экспортирован в Excel.Я думал о сохранении рисунка в буфер:

import numpy as np
import pandas as pd
import xlsxwriter
import matplotlib.pyplot as plt
from io import BytesIO

df = pd.DataFrame(np.random.random(size=(10, 3)),
                                   columns=['a', 'b', 'c'])
# make plot
fig, ax = plt.subplots()
df.plot(ax =ax)

# save plot
buffy = BytesIO()
fig.savefig(buffy, format='png')
buffy.seek(0)
img_data = buffy.read()

# export plot to an xlsx file
wb  = xlsxwriter.Workbook('test_BytesIO.xlsx')
ws = wb.add_worksheet('the_pic')
ws.insert_image('A1', 'image.png', {'image_data': img_data})

wb.close()

Но я борюсь за экспорт файла в лист Excel с помощью xlsxwriter.Любой вывод будет оценен.

Редактировать

@ jmcnamara: Добавление любого имени файла, например 'image.png', также не помогает:

Traceback (последний вызов был последним): Файл "C: ... \ binary_save_plt.py", строка 24, в файле wb.close () Файл "C: \ Users ... \ Python35 \ lib \ site-packages \ xlsxwriter \ workbook.py ", строка 306, в закрытом файле self._store_workbook ()" C: \ Users ... \ Python35 \ lib \ site-packages \ xlsxwriter \ workbook.py ", строка 637, в файле _store_workbook self._prepare_drawings ()"C: \ Users ... \ Python35 \ lib \ site-packages \ xlsxwriter \ workbook.py ", строка 1073, в _prepare_drawings self._get_image_properties (filename, image_data) Файл" C: \ Users ... \ Python35 \ lib \ "site-packages \ xlsxwriter \ workbook.py ", строка 1143, в _get_image_properties data = image_data.getvalue () AttributeError: у объекта 'bytes' нет атрибута 'getvalue'

1 Ответ

0 голосов
/ 01 марта 2019

Параметр image_data должен быть объектом BytesIO (а не данными из него).И вы можете дать любое подходящее имя для изображения в качестве имени файла.См. Документы по insert_image () .

Должно работать следующее:

buffy = BytesIO()
fig.savefig(buffy, format='png')

wb  = xlsxwriter.Workbook('test_BytesIO.xlsx')
ws = wb.add_worksheet('the_pic')
ws.insert_image('A1', 'image.png', {'image_data': buffy})
...