第6课:自动化闭环——把图表一键插入Excel和PPT
职场痛点:图画好了,结果还要手动复制 → 粘贴 → 调大小 → 改格式 → 放PPT → 再发邮件……
每周一早上8点,你蹲在工位里像个贴图员,领导还说:“怎么又晚了?”
别贴了!咱们用Python,一键搞定:画图 + 插Excel + 塞PPT + 发邮件。
一、先说清楚:我们这节课到底干啥?
我们来做一个真实场景的自动化闭环:
✅ 每周一早上8点✅ 自动生成一张销售趋势图(比如上周销量)✅ 自动插入到Excel表格里(带数据+图表)✅ 自动插入到PPT里(一页幻灯片,有标题、有图、有备注)✅ 自动发邮件给领导,附件带上这个Excel和PPT✅ 你全程不用动手,连电脑都不用开
听起来像魔法?其实就几段Python代码的事。
工具我们还是用 PyCharm,代码跑一次,以后每周自动来。
二、先装几个“干活的小弟”
在PyCharm里打开你的项目,先装这几个库:
pip install openpyxl python-pptx matplotlib schedule smtplib emai
解释一下它们是干啥的:
-
openpyxl:操作Excel,能写数据、插图片 -
python-pptx:操作PPT,能新建幻灯片、加图加字 -
matplotlib:画图用的(之前用过) -
schedule:定闹钟用的,比如“每周一8点执行” -
smtplib + email:发邮件用的
三、第一步:把图自动插进Excel
场景:你有个销售数据表,想把趋势图贴在旁边
我们先生成一个Excel,里面:
-
A列是日期,B列是销量
-
D1位置插入一张图
代码来了,直接复制
import openpyxlfrom openpyxl.drawing.image import Imageimport matplotlib.pyplot as pltimport pandas as pdimport os# 1. 先造点假数据data = {'日期': ['周一', '周二', '周三', '周四', '周五'],'销量': [120, 135, 110, 150, 180]}df = pd.DataFrame(data)# 2. 保存成Excelexcel_path = '带图的周报.xlsx'df.to_excel(excel_writer=excel_path, index=False)# 3. 画个图存成图片(解决中文乱码问题)plt.figure(figsize=(10, 6))# 关键修复:设置中文字体plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'KaiTi'] # 优先使用微软雅黑,其次黑体、楷体plt.rcParams['axes.unicode_minus'] = False# 正常显示负号# 绘制折线图plt.plot(df['日期'], df['销量'], marker='o', linestyle='-', color='blue', linewidth=2, markersize=8)# 设置标题和标签plt.title('销量趋势图', fontsize=14)plt.xlabel('日期', fontsize=12)plt.ylabel('销量', fontsize=12)plt.grid(True, linestyle='--', alpha=0.7)# 保存图片(只保存一次,避免重复警告)plt.tight_layout() # 自动调整布局plt.savefig('销量趋势.png', dpi=300, bbox_inches='tight')# 关闭图形,释放内存plt.close()# 将图片插入Excelif os.path.exists(excel_path) and os.path.exists('销量趋势.png'): wb = openpyxl.load_workbook(excel_path) ws = wb.active# 在Excel中插入图片(假设放在B7单元格) img = Image('销量趋势.png') img.width = 400 img.height = 300 ws.add_image(img, 'B7')# 保存Excel wb.save(excel_path) print(f"成功生成Excel和图片!文件路径:{os.path.abspath(excel_path)}")else: print("错误:Excel或图片文件未生成,请检查代码执行过程")


👉 效果:打开带图的周报.xlsx,你会看到右下脚贴着一张清爽的图。
四、第二步:把图自动塞进PPT
场景:领导要看PPT汇报,你不想一页页贴图
我们用python-pptx自动生成一页PPT:
-
标题:上周销售情况 -
内容:插入刚才那张图 -
备注:写一句“数据来源:销售部,趋势向好”
代码来了:
from pptx import Presentationfrom pptx.util import Inches# 创建PPTppt = Presentation()slide = ppt.slides.add_slide(ppt.slide_layouts[5]) # 空白页# 加标题title = slide.shapes.titletitle.text = "上周销售情况"# 插入图片(位置和大小)left = Inches(1)top = Inches(1.5)height = Inches(5)pic = slide.shapes.add_picture('销量趋势.png', left, top, height=height)# 加备注(演讲者备注)text = "数据来源:销售部\n趋势向好,建议加大推广"slide.notes_slide.notes_text_frame.text = text# 保存ppt.save('周报.pptx')print("✅ 图片已插入PPT!")


👉 效果:打开周报.pptx,一页清爽的汇报页就出来了,连备注都有。
五、第三步:把报告自动发邮件
场景:每周一早上8点,自动发给领导
把刚才生成的两个文件当附件发出去。
代码如下(记得改邮箱和密码):
from pptx import Presentationfrom pptx.util import Inches# 创建PPTppt = Presentation()slide = ppt.slides.add_slide(ppt.slide_layouts[5]) # 空白页# 加标题title = slide.shapes.titletitle.text = "上周销售情况"# 插入图片(位置和大小)left = Inches(1)top = Inches(1.5)height = Inches(5)pic = slide.shapes.add_picture('销量趋势.png', left, top, height=height)# 加备注(演讲者备注)text = "数据来源:销售部\n趋势向好,建议加大推广"slide.notes_slide.notes_text_frame.text = text# 保存ppt.save('周报.pptx')print("✅ 图片已插入PPT!")
📌 注意:
-
QQ邮箱要开“SMTP服务”,获取“授权码”(不是密码) -
其他邮箱(如163、企业微信)方法类似,搜“邮箱 SMTP 设置”就行
六、终极一步:让这一切每周自动运行!
我们用 schedule 库,让程序每周一早上8点自动跑。
import scheduleimport timefrom datetime import datetimedefjob(): print(f"⏰ 开始执行周报任务:{datetime.now()}")# 这里按顺序执行上面所有步骤# 你可以把前面的代码封装成函数,比如: generate_excel_with_chart() generate_ppt() send_email() print("✅ 本周周报已全部完成!")# 设定每周一早上8点执行schedule.every().monday.at("08:00").do(job)print("🚀 周报机器人已启动,等待执行...")whileTrue: schedule.run_pending() time.sleep(60) # 每分钟检查一次
📌 实际使用建议:
-
把整个流程封装成函数,比如 run_weekly_report() -
把这个脚本放在一台一直开机的电脑或服务器上(比如你家里的旧电脑) -
或者用 Windows任务计划程序 / Mac的launchd 定时启动
七、总结:你学会了什么?
-
用 openpyxl把图插进Excel -
用 python-pptx把图塞进PPT -
用 smtplib 自动发邮件带附件 -
用 schedule定时每周执行
从画图到发邮件,全程零手动,闭环打通。
八、你可以怎么升级?
-
加个时间判断:如果不是周一,就只生成不发邮件(测试用) -
把图表生成逻辑换成真实数据库查询 -
加个日志记录:每次执行成功/失败都记下来 -
用 yagmail简化发邮件代码(更简单) -
接入钉钉/企业微信机器人,发个通知:“周报已发送”
最后一句大实话:
别再当贴图工了。你花2小时写这段代码,未来52周,每周省下30分钟一年就是26小时,够你多放三天假。
自动化不是炫技,是偷懒的高级形式。
如果你觉得这课有用,点赞 + 在看,让我知道你在看。有啥问题,评论区直接问,小居一个个回!
夜雨聆风