将内存中的图表对象发送到 Excel 文件
send an in-memory chart object to Excel file
抱歉,我是新手,请多多包涵。有没有办法将内存文件(使用 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')
问题是图像处理代码当前需要文件路径。如果您查看提供的完整回溯,您可以看到哪里需要这样做。
使用临时文件而不是内存中的图像实际上不会降低图像的效率,所以无论如何我建议这样做。
至少从 openpyxl v2.6.2 开始,完全可以插入 in-memory 图像,而不需要临时文件保存来欺骗处理代码。问题是 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')
使用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
抱歉,我是新手,请多多包涵。有没有办法将内存文件(使用 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')
问题是图像处理代码当前需要文件路径。如果您查看提供的完整回溯,您可以看到哪里需要这样做。
使用临时文件而不是内存中的图像实际上不会降低图像的效率,所以无论如何我建议这样做。
至少从 openpyxl v2.6.2 开始,完全可以插入 in-memory 图像,而不需要临时文件保存来欺骗处理代码。问题是 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')
使用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