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