影刀RPA Excel图表生成:自动创建图表
影刀RPA Excel图表生成自动创建图表署名林焱什么情况用什么RPA采集了一周的销售数据需要自动生成折线图放进周报邮件里。手动截图再贴那每天都要手动操作。用Python代码块openpyxl可以直接在Excel里创建图表也可以用matplotlib生成图片插入到Excel或发送邮件。方式适用场景优缺点openpyxl原生图表需要在Excel里可编辑的图表原生Excel图表可交互但样式有限matplotlib生成图片需要复杂图表或插入邮件样式自由度高但是静态图片怎么做方式一openpyxl创建Excel原生图表importopenpyxlfromopenpyxl.chartimportBarChart,LineChart,PieChart,Reference,Series wbopenpyxl.load_workbook(rD:\报表\周报数据.xlsx)wswb[销售数据]# 柱状图 bar_chartBarChart()bar_chart.title各区域销售额对比bar_chart.typecol# col竖柱, bar横柱bar_chart.style10# 样式编号1-48bar_chart.x_axis.title区域bar_chart.y_axis.title销售额(元)# 数据范围B1标题行 B2:B7数据dataReference(ws,min_col2,min_row1,max_row7,max_col2)# 类别标签A2:A7categoriesReference(ws,min_col1,min_row2,max_row7)bar_chart.add_data(data,titles_from_dataTrue)bar_chart.set_categories(categories)bar_chart.width20# 宽度cmbar_chart.height12# 高度cm[video(video-7iCBD0yV-1783500764150)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架)]# 插入到指定单元格ws.add_chart(bar_chart,D2)# 折线图 line_chartLineChart()line_chart.title日销售趋势line_chart.y_axis.title销售额line_chart.x_axis.title日期# 多列数据B-D列销售额/成本/利润dataReference(ws,min_col2,max_col4,min_row1,max_row30)catsReference(ws,min_col1,min_row2,max_row30)line_chart.add_data(data,titles_from_dataTrue)line_chart.set_categories(cats)line_chart.width20line_chart.height12ws.add_chart(line_chart,D20)wb.save(rD:\报表\周报数据.xlsx)方式二饼图fromopenpyxl.chartimportPieChart,Reference piePieChart()pie.title品类占比dataReference(ws,min_col2,min_row1,max_row6)labelsReference(ws,min_col1,min_row2,max_row6)pie.add_data(data,titles_from_dataTrue)pie.set_categories(labels)pie.width15pie.height10# 显示百分比标签fromopenpyxl.chart.labelimportDataLabelList pie.dataLabelsDataLabelList()pie.dataLabels.showPercentTruews.add_chart(pie,H2)方式三matplotlib生成图片importmatplotlib matplotlib.use(Agg)# 无界面模式importmatplotlib.pyplotasplt# 准备数据months[1月,2月,3月,4月,5月,6月]sales[120,150,180,200,190,220]costs[80,95,110,130,125,140]# 设置中文字体plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei]plt.rcParams[axes.unicode_minus]Falsefig,axplt.subplots(figsize(10,6))# 双柱状图xrange(len(months))bar_width0.35ax.bar([i-bar_width/2foriinx],sales,bar_width,label销售额,color#4472C4)ax.bar([ibar_width/2foriinx],costs,bar_width,label成本,color#ED7D31)# 折线图叠加ax2ax.twinx()profits[s-cfors,cinzip(sales,costs)]ax2.plot(x,profits,g-o,label利润,linewidth2)ax.set_xlabel(月份)ax.set_ylabel(金额(万元))ax2.set_ylabel(利润(万元))ax.set_title(2024上半年经营分析)ax.set_xticks(x)ax.set_xticklabels(months)ax.legend(locupper left)ax2.legend(locupper right)plt.tight_layout()plt.savefig(rD:\报表\经营分析图.png,dpi150,bbox_inchestight)plt.close()完整流程周报图表自动生成importopenpyxlfromopenpyxl.chartimportLineChart,BarChart,Referenceimportmatplotlib matplotlib.use(Agg)importmatplotlib.pyplotaspltimportos# yd_input: file_path, report_datefile_pathyd_input.get(file_path,rD:\报表\周报.xlsx)report_dateyd_input.get(report_date,2024-06-30)wbopenpyxl.load_workbook(file_path)wswb[数据]max_rowws.max_row# 1. Excel原生折线图chartLineChart()chart.titlef周销售趋势 ({report_date})chart.style12chart.y_axis.title销售额chart.x_axis.title日期dataReference(ws,min_col2,max_col2,min_row1,max_rowmax_row)catsReference(ws,min_col1,min_row2,max_rowmax_row)chart.add_data(data,titles_from_dataTrue)chart.set_categories(cats)chart.width22chart.height10ws.add_chart(chart,E2)# 2. matplotlib生成饼图图片plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei]plt.rcParams[axes.unicode_minus]Falsecategories[]values[]forrowinrange(2,max_row1):namews.cell(rowrow,column1).value valws.cell(rowrow,column2).valueor0ifname:categories.append(str(name))values.append(float(val))fig,axplt.subplots(figsize(8,8))colors[#4472C4,#ED7D31,#A5A5A5,#FFC000,#5B9BD5,#70AD47]ax.pie(values,labelscategories,autopct%1.1f%%,colorscolors[:len(values)])ax.set_title(f销售占比 ({report_date}))img_pathos.path.join(os.path.dirname(file_path),占比图.png)plt.savefig(img_path,dpi150,bbox_inchestight)plt.close()# 3. 把图片插入Excelfromopenpyxl.drawing.imageimportImageasXlImage imgXlImage(img_path)img.width400img.height400ws.add_image(img,E25)wb.save(file_path)yd_output{status:ok,chart_img:img_path}有什么坑坑一openpyxl图表数据范围选错现象图表生成后没有数据或者显示了标题行本身作为数据点。原因Reference的min_row参数设置错误。如果包含标题行需要titles_from_dataTrue但数据范围必须包含标题行。解决# 正确min_row1包含标题titles_from_dataTrue自动识别标题dataReference(ws,min_col2,min_row1,max_row30,max_col2)chart.add_data(data,titles_from_dataTrue)# 也正确min_row2不包含标题手动设置系列名dataReference(ws,min_col2,min_row2,max_row30)chart.add_data(data,titles_from_dataFalse)chart.series[0].title销售额# 错误包含标题但不设titles_from_data# data Reference(ws, min_col2, min_row1, max_row30)# chart.add_data(data, titles_from_dataFalse) ❌ 标题销售额会被当成数据点坑二matplotlib中文乱码现象图表标题和标签全是方块或问号。原因matplotlib默认字体不支持中文。解决设置中文字体# 方案1设置全局字体plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei,KaiTi]plt.rcParams[axes.unicode_minus]False# 解决负号显示# 方案2查找系统中可用的中文字体importmatplotlib.font_managerasfm fonts[f.nameforfinfm.fontManager.ttflistifHeiinf.nameorYaHeiinf.nameorSonginf.name]print(fonts)# 查看可用的中文字体坑三图表大小不匹配导致Excel里变形TEMU店群矩阵自动化运营核价报活动现象图表在Excel里看起来很小或很大比例失调。原因openpyxl的chart.width和chart.height单位是厘米默认大约15cm×7.5cm。解决# 设置合理大小A4纸宽度约21cmchart.width20# 宽20cmchart.height10# 高10cm# matplotlib图片插入Excel时也要设置大小fromopenpyxl.drawing.imageimportImageasXlImage imgXlImage(img_path)# 像素大小不是cm一般缩放到400×300左右img.width400img.height300ws.add_image(img,A1)坑四保存图表后Excel打开报修复现象用openpyxl加了图表后保存Excel打开时提示文件已损坏是否修复。原因openpyxl的图表功能对某些复杂图表类型支持不完善或者文件本身已有图表导致冲突。解决# 方案1新建文件而不是在已有文件上加图表wbopenpyxl.Workbook()wswb.active# 先写入数据再加图表# 方案2如果必须修改已有文件先检查是否已有图表ifws._charts:# 清除已有图表ws._charts.clear()ws.add_chart(new_chart,D2)# 方案3用matplotlib生成图片插入避开openpyxl图表的兼容性问题