Python中如何使用Plotly将生成的图片直接存入内存并插入Word文档

我在 python3.6 上用 plotly 生成了一组图片,我想把这组图片插入一个 word 的.docx 文档。但是目前我只能生成一个带图片的.html 文件,即使我在 offline.plot()里加上了下载图片的选项也只是在我打开这个生成的.html 文件才会弹出下载选项。有没有办法可以直接将生成的图片存在内存然后在下一步的代码里把它插入 word ?如果不行的话那有没有办法可以让我生成的图片可以自动下载,而不用我打开.html 时才会提示下载?
Python中如何使用Plotly将生成的图片直接存入内存并插入Word文档

1 回复

这个需求很常见,尤其是在需要自动化生成报告的场景。Plotly本身不直接支持写入Word,但我们可以通过结合plotlyPIL(或io)和python-docx库来实现。核心思路是:先用Plotly生成图像,将其转换为内存中的字节流(避免保存到磁盘),然后插入到Word文档。

下面是一个完整的示例代码:

import plotly.graph_objects as go
from io import BytesIO
from PIL import Image
from docx import Document
from docx.shared import Inches

# 1. 创建Plotly图形
fig = go.Figure(data=go.Bar(x=['A', 'B', 'C'], y=[10, 20, 15]))
fig.update_layout(title='示例图表')

# 2. 将图形转换为内存中的图像字节流
# 使用BytesIO作为内存缓冲区
img_bytes = fig.to_image(format='png')  # 直接得到PNG的bytes

# 3. 将字节流加载到PIL Image对象(便于后续操作,如调整尺寸)
img_buffer = BytesIO(img_bytes)
pil_img = Image.open(img_buffer)

# 4. 创建或加载Word文档
doc = Document()
doc.add_heading('包含Plotly图表的Word文档', 0)
doc.add_paragraph('这是一个自动插入的Plotly图表:')

# 5. 将图像插入Word
# 先将PIL图像保存到另一个BytesIO(因为python-docx需要文件路径或类似文件的对象)
img_for_word = BytesIO()
pil_img.save(img_for_word, format='PNG')
img_for_word.seek(0)  # 将指针移回开头

# 插入图像到Word,可以指定宽度(例如6英寸)
doc.add_picture(img_for_word, width=Inches(6))

# 6. 保存Word文档
doc.save('output_with_plotly_chart.docx')

print("Word文档已生成,包含Plotly图表。")

代码解释:

  1. 生成Plotly图表:使用plotly.graph_objects创建一个简单的柱状图。
  2. 转换到内存fig.to_image(format='png')是关键,它直接返回图像的二进制数据(bytes),无需保存到磁盘。
  3. 使用PIL处理:将bytes加载到BytesIO缓冲区,然后用PIL的Image.open打开。这一步允许我们调整图像属性(如尺寸)后再插入Word。
  4. 插入Wordpython-docxadd_picture方法接受一个文件路径或类似文件的对象。我们将PIL图像保存到另一个BytesIO对象,并确保指针在开头,然后插入。
  5. 保存文档:最后保存为.docx文件。

如果你不想用PIL调整图像,可以更直接:

# ... 创建fig同上 ...
img_bytes = fig.to_image(format='png')
img_buffer = BytesIO(img_bytes)
doc.add_picture(img_buffer, width=Inches(6))
# ... 保存文档同上 ...

这样更简洁,但少了用PIL调整的灵活性。

一句话总结:用to_image()转bytes,BytesIO做内存桥梁,再用python-docx插入。

回到顶部