将内存图表对象发送到Excel文件

时间:2018-06-27 14:45:20

标签: python openpyxl

对不起,我是新手,所以请保持温柔。是否可以将内存文件(使用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')

3 个答案:

答案 0 :(得分:0)

问题是图像处理代码当前需要文件路径。如果查看提供的完整回溯,则可以看到需要这样做的地方。

使用临时文件而不是内存中的图像实际上并没有降低效率,因此我还是建议这样做。

答案 1 :(得分:0)

至少从openpyxl v2.6.2开始,完全有可能插入内存图像,而无需临时保存文件来愚弄处理代码。问题在于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')

答案 2 :(得分:0)

使用io.ByteIO和penpyxl.drawing.image.Image将图片数据写入excel,无需任何临时磁盘存储。

from openpyxl import Workbook
from openpyxl.drawing.image import Image
from io import ByteIO

book = Workbook()
sheet = book.active

# do something here

img = Image(BytesIO(your_picture_data)))
sheet.add_image(img, 'A1')

# do something here