如何用Python仅打开一次Excel文件,同时追加DataFrame与图片至不同工作表?
解决方案
完全可以只打开一次Excel文件,高效完成DataFrame写入和图片插入操作。借助你已经在用的openpyxl引擎的原生API,就能在同一个pd.ExcelWriter会话里完成所有操作,避免多次打开关闭文件带来的性能损耗。
基于本地图片文件的实现(沿用你现有保存图片的逻辑)
修改后的代码如下,注释已标注关键细节:
import pandas as pd import matplotlib.pyplot as plt from openpyxl.drawing.image import Image # 替换成你的实际DataFrame df = pd.DataFrame({'列1': [1, 2, 3], '列2': [4, 5, 6]}) # 生成并保存图片(你的原有代码) plt.plot(df['列1'], df['列2']) plt.savefig('image.png', dpi=1200, bbox_inches='tight') plt.close() # 关闭绘图对象,避免内存泄漏 # 仅一次打开Excel文件 writer = pd.ExcelWriter('output.xlsx', engine='openpyxl', mode='a', if_sheet_exists='replace') # 写入DataFrame到指定工作表(注意index是布尔值,不要加引号) df.to_excel(writer, sheet_name='Sheet', index=False) # 获取工作簿对象,开始处理图片插入 workbook = writer.book # 处理图片工作表:如果存在则删除(可根据需求调整为追加模式) image_sheet_name = '图片工作表' if image_sheet_name in workbook.sheetnames: del workbook[image_sheet_name] # 创建新的图片工作表 image_sheet = workbook.create_sheet(image_sheet_name) # 加载图片并插入到工作表的指定位置(比如A1单元格) img = Image('image.png') image_sheet.add_image(img, 'A1') # 一次性保存所有修改并关闭文件 writer.save() writer.close()
优化方案:内存中处理图片(无需生成本地文件)
如果不想在本地生成图片文件,可以用io.BytesIO在内存中暂存图片,进一步提升效率:
import pandas as pd import matplotlib.pyplot as plt from openpyxl.drawing.image import Image import io # 替换成你的实际DataFrame df = pd.DataFrame({'列1': [1, 2, 3], '列2': [4, 5, 6]}) # 生成图片并保存到内存缓冲区 img_buffer = io.BytesIO() plt.plot(df['列1'], df['列2']) plt.savefig(img_buffer, dpi=1200, bbox_inches='tight') img_buffer.seek(0) # 将缓冲区指针移到开头,方便后续读取 plt.close() # 仅一次打开Excel文件 writer = pd.ExcelWriter('output.xlsx', engine='openpyxl', mode='a', if_sheet_exists='replace') # 写入DataFrame df.to_excel(writer, sheet_name='Sheet', index=False) # 处理图片工作表 workbook = writer.book image_sheet_name = '图片工作表' if image_sheet_name in workbook.sheetnames: del workbook[image_sheet_name] image_sheet = workbook.create_sheet(image_sheet_name) # 从内存加载图片并插入 img = Image(img_buffer) image_sheet.add_image(img, 'A1') # 保存修改并关闭 writer.save() writer.close()
关键细节说明
- 通过
writer.book直接获取openpyxl的Workbook对象,无需单独再次打开Excel文件 - 图片工作表的逻辑可灵活调整:如果需要在已有工作表追加图片,删除
del workbook[image_sheet_name],改用image_sheet = workbook[image_sheet_name]即可 - 插入位置可自定义,比如
'B2'表示从B2单元格开始放置图片 - 修正了你原有代码中
index='False'的错误:这里需要传入布尔值False,字符串会导致索引列被命名为'False'
内容的提问来源于stack exchange,提问作者amde
相关产品推荐
相关产品推荐

