python3 excel 图表导出图片_使用python代码将excel中的图表导出为图片

python导出Excel图表类

前期准备就绪,网上已有类似的导出Excel图表类,但是在后面的使用中发现问题,即关键函数已在下面代码中标红:

调用代码:

执行成功,接下来到上面设置的导出路径查看导出的图片:

从文件查看中看到,图表文件已经成功导出;

图表导出的问题

但是,图表的导出并未能完全成功,从以上文件信息中看到导出的图片存在0字节的文件;点击查看图片可发现提示为空文件

具体原因分析:

经过本人多次的测试和探索发现:有效的图片为Excel的图表区域显示页面,通俗一点的说,即打开excel的图表所在sheet,当前屏幕显示了哪些图表,导出的图片就正常;在我个人认为可能是Office或Python对Excel的某种缓存功能,实际的缓存范围大概在当前显示页面的150%左右,超出区域的图表在未加载的情况下,导出成了0字节错误文件;

即使发现了这个BUG,网上搜索也未能找到有效的类似"关闭加载缓存"的技术贴,那么还得根据导出图表的基础逻辑解决;

继续测试,在Excel的图表中缩放显示全部图片测试,按照测试数据图表范围,缩放25%可显示全部图表(>_>或者把所有图表拖动到一个页面显示):

如上述文件查看所示,当图表所在的sheet页面显示了所有图表时,所有图表的图片都成功的导出;

但是,缩放导出的图片是根据Excel的图标实际显示大小来导出的,所以缩放模式下,导出的图片大小、清晰度都不能正常使用;

解决方案

综上所述,已知Python根据Excel的图标实际显示来导出,那么,可以让Python的导出代码执行前加载所有正常图表,在之前的python导出Excel图表的类中,使用异步方式调用excel.application,即文档以后台方式导出图表;

如果需要完成Excel的所有图表加载,即必须手动或代码干预导出过程,在类中已经有代码可以设置文档可见;

excel.Visible = True#设置导出Excel是否可见,当值为True时,可见打开的Excel

修改原代码:

解决方式显而易见,过程不多做描述;个人是使用win32api、win32con模块模拟键盘操作加载所有图表,因无法确认图表sheet所在的位置,需提前将图表所在的sheet设置在Excel文档的最后;或者可根据实际情况,由代码完成所有sheet的加载操作(比如多按几下pagadown翻页,屏幕识别判定内容范围等....)

总结

从python导出Excel的图表来说,这一块的功能比较适用用单个图表的导出操作,如果涉及到大量的批量的图表导出,这种导出方式不太友好;实际工作如果涉及到批量的简单图表制作,重复度较高的工作性质可以由 matplotlib 模块自己绘制图表;

要在PythonExcel表格图表导出图片,可以使用`openpyxl`和`matplotlib`等库来完成。以下是一个示例代码,展示如何读取Excel文件图表并将其保存为图片: 1. 安装所需的库(如果尚未安装): ```bash pip install openpyxl matplotlib ``` 2. 使用以下代码读取Excel文件图表并保存为图片: ```python import openpyxl from openpyxl.chart import ScatterChart, Reference, Series import matplotlib.pyplot as plt import numpy as np # 打开Excel文件 workbook = openpyxl.load_workbook('your_excel_file.xlsx') sheet = workbook.active # 读取数据 data = [] for row in sheet.iter_rows(min_row=2, max_col=8, values_only=True): data.append(row) # 换为numpy数组 data = np.array(data) # 提取各列数据 focus = data[:, 0] t_lu = data[:, 1] s_ld = data[:, 2] s_ru = data[:, 3] t_rd = data[:, 4] s_avg = data[:, 5] t_avg = data[:, 6] st_avg = data[:, 7] # 创建图表 fig, ax = plt.subplots() # 绘制散点图 ax.plot(focus, t_lu, label='T_LU', marker='o') ax.plot(focus, s_ld, label='S_LD', marker='o') ax.plot(focus, s_ru, label='S_RU', marker='o') ax.plot(focus, t_rd, label='T_RD', marker='o') ax.plot(focus, s_avg, label='S_avg', marker='o') ax.plot(focus, t_avg, label='T_avg', marker='o') ax.plot(focus, st_avg, label='(S+T)_avg', marker='o') # 添加标题和标签 ax.set_title('MTF vs Focus') ax.set_xlabel('Focus') ax.set_ylabel('MTF') ax.legend() # 保存图表图片 plt.savefig('chart.png') # 显示图表 plt.show() ``` 在这个示例,我们假设Excel文件的数据从第二行开始,并且第一行是表头。代码读取了Excel文件的数据,然后使用`matplotlib`创建了一个散点图,并将其保存为PNG格式的图片。 请根据您的实际需求调整代码的路径和数据列索引。希望这能帮助您实现目标!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值