ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

报表自动化:每天自动生成FAB日报

报表自动化:每天自动生成FAB日报 小吴是生产计划组的新人入职第一周就被“日报”吓到了WIP在制品表要从MES导出工单进度表要从另一套系统复制良率表要从SPC工具截屏三张表格式相似、数据源不同填完还要拼成一份邮件发出去。每周五的周报更崩溃——四个系统的数据各导一遍复制粘贴三回谁都保不齐不填错一个格。她跟我吐槽时我回了她一句话凡是“每天重复、格式固定、数据来自系统”的活都该写成脚本。这篇文章用Pythonopenpyxl从零搭一套FAB日报自动生成系统覆盖WIP、工单、良率三个核心Sheet再配上matplotlib图表最后挂到Windows计划任务实现“人睡了报表自己出”。一、整体架构报表自动化的四层结构FAB日报系统的核心是把生成过程拆成四层数据采集层从MES/FDC/手工文件读数据、数据处理层清洗、转换、计算、报表生成层openpyxl写Excel、分发层邮件/钉钉推送。每层是独立模块只通过数据字典传递这样换数据源或换格式都不会牵连其他层。图1一个工作簿聚合WIP/工单/良率/异常四张表数据源来自三个系统二、核心代码①WIP在制品SheetWIP表要体现“哪些lot卡在哪一站、停留多久”。openpyxl写起来很直白建Workbook、建Sheet、用append一行行写再用PatternFill给超期lot标红。下面这段代码可直接运行。from openpyxl import Workbookfrom openpyxl.styles import Font, PatternFill, Alignmentwb Workbook()ws wb.activews.title WIPheader [Lot号, 当前站别, 停留(h), 状态]ws.append(header)#表头加粗深底hd_fill PatternFill(solid, fgColor1f4e79)for c in ws[1]:c.font Font(boldTrue, colorFFFFFF)c.fill hd_fillc.alignment Alignment(horizontalcenter)#模拟WIP数据wip [(LOT-2207, CVD, 3.2, 正常),(LOT-2208, LITHO, 18.5, 超期), #停留超12h -标红(LOT-2209, ETCH, 6.1, 正常),]red PatternFill(solid, fgColorf8cbad)for lot, step, stay, st in wip:ws.append([lot, step, stay, st])if stay 12:for cell in ws[ws.max_row]:cell.fill redwb.save(FAB日报.xlsx)三、核心代码②工单进度 良率Sheet工单表关心“计划 vs 实际产出”良率表关心“当日良率 vs 目标”。两者都适合用openpyxl的公式计算这样打开Excel还能看到实时比值不只是死数字。#工单进度Sheetws2 wb.create_sheet(工单)ws2.append([工单, 计划片数, 实际片数, 达成率])orders [(WO-101, 500, 482), (WO-102, 300, 300), (WO-103, 200, 176)]for wo, plan, act in orders:ws2.append([wo, plan, act, fC{ws2.max_row1}/B{ws2.max_row1}])ws2[D2].number_format 0.0%#良率Sheetws3 wb.create_sheet(良率)ws3.append([层别, 目标%, 实际%, 偏差])yield_data [(CVD, 95, 94.2), (LITHO, 96, 95.1), (ETCH, 94, 92.8)]for layer, tgt, act in yield_data:ws3.append([layer, tgt, act, fC{ws3.max_row1}-B{ws3.max_row1}])wb.save(FAB日报.xlsx)print(日报已生成: WIP /工单/良率三张表)四、把图表和调度也接上光有数字还不够主管更爱看图。我们在报表生成后顺手用matplotlib画一张“当日良率vs目标”的横向条图存成PNG嵌进邮件正文。再写一个main()把上面四层串起来读数据→算指标→写Excel→画图→发邮件。图2六步流水线挂计划任务后无人值守自动跑调度这一步Windows用“任务计划程序”加一条触发器每天08:00启动python gen_report.py即可Linux/macOS用crontab加一行“0 8 * * * /usr/bin/python3 gen_report.py”。关键是脚本里所有路径用绝对路径且日志写到文件哪天没出报表查日志就知道卡在哪。# Windows任务计划/ Linux crontab都只需一行入口# crontab: 0 8 * * * /usr/bin/python3 gen_report.py report.log 21def main():data collect() #采集层metrics transform(data) #处理层write_excel(metrics) #报表层fig draw_chart(metrics) #图表send_mail(fig) #分发层if __name__ __main__:main()小吴照着搭完第一天早上八点零五日报已经躺在主管邮箱里。她再也不用周五下午对着四个系统复制粘贴把那两小时拿去学了SPC一个月后反过来给组里做了次培训。自动化的意义从来不只是省时间更是把人从重复劳动里解放出来去做只有人能做的事。四、数据校验层别让脏数据进报表前面四层里我特意没提、却最关键的是校验层。如果源数据本身错了报表出得再快也是错的而且错得理直气壮。我们在采集之后、计算之前加了一道校验必填字段缺失、数值越界、时间倒挂、重复lot一律拦截并告警绝不静默写进Excel。校验逻辑很简单定义每个字段的类型和合理范围逐行检查异常的记日志并跳过正常的才进下一步。这套校验上线后第一周就抓出三起设备离线但系统显示运行的假数据避免基于假数据做的错误排程。报表自动化的前提是数据可信。五、邮件推送smtplib一行接入生成完Excel和图表最后一步是推给主管。用Python标准库smtplib就能发把图表PNG作为正文嵌入或作为附件Excel作为附件。关键是异常也要发——脚本崩了不能静默要发一封今日日报生成失败的告警邮件否则没人知道报表没出。我们给邮件加了失败即告警用try包住整个mainexcept里发红色主题邮件给数据组。这样哪怕凌晨崩了人醒来第一眼邮件里就有提示而不是主管问今天怎么没日报时才发现。六、openpyxl常见坑坑一日期写成字符串导致Excel不认解决是用datetime对象或显式设number_format。坑二单元格样式不生效因为openpyxl里同一个style对象被多格引用时改一处全变建议每格新建Style或复用同一对象时想清楚。坑三公式在openpyxl里只写不计算打开Excel才会算若想脚本里拿到值要用data_only配合已打开保存过一次的文件。坑四大文件用write_only模式提速但就不能再改已写的格坑五中文sheet名别用特殊字符部分旧版Excel会拒绝打开。把这五个坑记牢报表生成的稳定性能上一个台阶。七、从日报到看板自动化的下一站日报是自动化的起点不是终点。等日报稳了可以往上叠周报月报同一套数据换聚合维度、管理看板把关键指标推到大屏、异常自动派单指标跌破阈值直接建工单。数据底座打通后这些只是加几段代码的事。小吴现在不只是做日报的人而是搭数据管道的人——她把组里所有人的重复报表都接进了系统自己腾出时间学了SPC和OEE半年后成了组里最年轻的技术骨干。自动化给你的从来不只是省下的那两小时。八、报表样式的细节让人愿意看报表不是数据堆上去就完事。我们定了排版铁律表头深蓝底白字、超期单元格浅红、目标达成率用条件格式大于等于100%绿、90到100%黄、小于90%红、关键数字加粗、行高统一。这些细节让主管扫一眼就抓重点而不是眯着眼找数。openpyxl做条件格式用ConditionalFormattingRule按公式着色冻结首行让长表滚动时表头常驻列宽按内容自适应。样式投入半小时每天省下全厂读表十分钟这笔账怎么算都值。from openpyxl.formatting.rule import CellIsRule#达成率列(D) 90%标红, 100%标绿ws.conditional_formatting.add(D2:D100,CellIsRule(operatorlessThan, formula[0.9],fillPatternFill(solid, fgColorf8cbad)))ws.conditional_formatting.add(D2:D100,CellIsRule(operatorgreaterThanOrEqual, formula[1.0],fillPatternFill(solid, fgColorc6efce)))ws.freeze_panes A2 #冻结首行九、多Sheet工作簿的导航与命名一个日报四张Sheet主管常找不到哪张是啥。我们给工作簿加了目录Sheet放最前列出每张表名称、内容、负责人、更新时间点名称跳转。Sheet命名用英文前缀加中文如WIP_在制品、YIELD_良率既便于脚本引用又便于人读。命名规范是多人协作报表的隐形契约。还有个小技巧给每张表首行加返回目录提示长报表滚动时人不迷路。导航看起来是小事但它决定了报表是被每天用还是被丢进文件夹吃灰。十、把日报接入企业统一调度单机计划任务只是起步。企业里我们用调度平台管所有报表任务靠DAG定义依赖先采数、再算、后发失败自动重试、超时才告警。好处是任务多了也不乱谁依赖谁一目了然。对小团队Windows任务计划或cron足够上百个报表时必上调度平台。无论哪种原则不变任务可观测、失败可告警、重跑可追溯。自动化不是写完脚本就结束是把脚本放进可被管理的体系。小吴的故事证明当报表自己跑起来人就被解放出来去做只有人能做的改善。八、真实案例一份周报引发的自动化小吴的主管有次周五下班前甩来一句周报怎么还没好小吴手忙脚乱导四个系统、复制粘贴还是填错了一个汇总数被当众点名。那天她下定决心周报必须自动化。她给日报系统加了个周聚合层同一套数据按周groupby周五自动出周报再没填错过也再没被点名。这个案例说明自动化的种子往往是一句又错了的痛。哪里反复错、反复烦哪里就值得写脚本。别等完美方案先把最痛的一次性动作自动化收益立刻兑现正反馈会推着你继续往前从日报到周报到月报一路滚雪球。九、Excel之外的多形态输出openpyxl出的Excel不是终点。我们给日报加了两条出口一条用matplotlib图嵌进Word做正式报告一条用同一份数据渲染成内部Web看板主管手机就能看。一份数据三种形态各取所需——主管看板、工程师看Excel、客户看Word互不干扰。多形态的关键是数据层解耦报表生成只产出一个结构化结果DataFrame或dictExcel、Word、Web各自消费它。这样加一种输出只是加一个renderer不动核心逻辑。架构上数据一次算、多处渲染是报表系统能长期演进的命根也是它不随着需求变化而推倒重来的原因。十、常见线上故障与应对日报系统跑半年我们遇过几类典型故障MES接口超时解决是加重试加超时熔断、失败转昨日缓存、Excel被占用写不进解决是写临时文件再原子替换、图表中文方块解决是容器里装SimHei字体、邮件被网关拦截解决是走企业邮件网关而非公网SMTP。每类故障我们都沉淀成一条防护接口不稳就重试加缓存文件占用就临时写再替换字体缺失就打包字体邮件失败就换网关。自动化系统的稳定性是一茬一茬故障喂出来的。别指望一次写对要指望每次故障都变成一条铁律写进模板下次不再犯。还有个隐蔽坑时区。定时任务跑在服务器UTC时间而业务按北京时间差八小时会让今日日报算出昨天的数据。我们强制所有时间用业务时区并显式标注彻底消灭这类时差bug。时间处理看似小事出了问题最难查。十一、把报表骨架做成团队模板小吴现在带两个新人把数据校验加失败告警加临时写原子替换加多形态输出做成了组里的报表骨架模板。任何新报表基于模板十分钟起手再不用从零踩坑。自动化的终极形态是把你踩过的坑变成后来人不用踩的模板。模板还带来一致性全组报表用同一套字段口径、同一套样式、同一套告警逻辑跨报表对比不再各说各话。可视化一致性在工程里不是审美问题是可信问题——口径乱的报表再好看也没人敢拿来决策。最后说一句报表自动化最容易被人当成低端活不屑做但恰恰是它决定了工程师每天是把时间花在复制粘贴还是花在思考。小吴从做日报的人变成搭数据管道的人靠的不是更聪明的算法而是肯把重复活彻底自动化的那股轴劲。如果你也正被日报周报折磨别忍、别等今天就写第一个能跑的脚本。第一个最难跑通了后面的雪球自己会滚起来。当某天你早上到岗发现报表早已安静躺在邮箱而你昨晚睡了个好觉——那一刻你会懂自动化给的不只是时间是底气。官网独享资源里有可直接用的FAB日报生成器模板改改数据源就能接你自己的产线让你也早一天体会这种底气。十二、报表的权限与审计日报里有机密良率、配方、产能权限不能松。我们给报表系统加了角色控制工程师看自己工段经理看全厂外部人员看不到。导出的Excel带水印和打开密码防止误发。还要留审计谁在何时生成、下载了哪份报表全记录。一旦数据外泄能追溯。审计不是不信任是合规要求也是保护每个人——证明你没动不该动的数据。十三、报表的口径管理报表口径变来变去是最毁信任的。我们建了指标字典每个指标定义、计算公式、数据来源、更新频率都写清楚报表严格按字典算。任何人想改口径走评审改完字典同步更新。曾经两个部门对同一良率数字对不上吵了半天发现一个含返工一个不含。自那以后所有口径进字典谁算错一查就知道。指标字典是报表系统的地基没有它再漂亮的图也是各说各话。十四、从日报到指标中台日报做顺了自然会想要更多周报、月报、看板、预警。这时别每个都从零写而是抽一个指标中台底层统一采集计算上层按需求组装。中台一次算处处用避免同一指标各处重算结果还不一致。指标中台听起来大起步很小先把良率、OEE、WIP几个核心指标的计算固化成一个服务报表、看板都调它。等核心稳了再扩。架构演进永远从小而对的起点滚起来。十五、报表自动化的ROI怎么算老板问值不值要用数字答。我们算过小吴组原来每天2小时做日报、周五半天做周报一年约600小时自动化后降到每天10分钟复核一年省550小时。按工程师时薪折算半年回本之后纯赚。ROI不只算省钱还算少错的收益手工报表填错一次可能误导排程损失几万自动化把这类错降到零。把避免的损失也算进收益自动化的价值才完整。会算ROI的工程师才敢跟老板要资源。十六、给不同规模团队的路径小团队几人Windows计划任务加cron一个脚本管所有够用。中团队几十人上调度平台加指标字典加权限控得住混乱。大团队几百人指标中台加多形态输出加审计支撑全厂。路径随规模长别小团队就上中台也别大团队还靠单机脚本。选型匹配规模是工程成熟的标志。见过小团队非要上复杂中台结果没人维护烂尾也见大团队靠单机脚本半夜崩了全厂等。十七、收尾不起眼的高性价比投资最后说一句掏心窝的报表自动化是工程师性价比最高的投资之一。它不性感但天天在用它不炫但真省钱省错。小吴从被周报点名到带新人搭中台靠的就是肯把这件不起眼的活做到底、做扎实。如果你也想起步别规划三年大平台明天就写一个能跑的日报脚本。第一个跑通雪球就滚起来了。官网独享资源里的FAB日报生成器就是帮你滚第一个雪球的最佳起点改改数据源就能接你自己的产线。十八、报表的容灾与备份报表系统挂了全厂没数据看也是事故。我们给报表做了容灾生成结果同时存两份本地加对象存储任务失败自动用昨日缓存顶上主管至少看得到昨天的数据不至于瞎指挥。备份还分冷温热热备实时、温备按小时、冷备按天归档。不同重要度数据不同策略既省成本又保底线。自动化系统也要有Plan B这是它能被信任的最后一道保险。十九、报表与决策的关系报表的终点是决策不是出图。我们要求每份日报末尾附今日需关注的三件事把数据翻译成行动建议主管看完直接拍板不用自己再嚼一遍数字。报表从呈现走向建议价值翻倍。当报表开始驱动决策它就从成本中心变成利润中心——它不光告诉你发生了什么还告诉你该做什么。这一步是报表自动化真正的成人礼。二十、报表的可观性设计好的报表自己会说话。我们定了一条任何关键指标异常报表首页就要用红黄绿三色标出主管扫一眼就知道今天哪里要管不用翻到第三页找数字。可观性设计是报表被用的前提。还有趋势箭头环比上升绿箭头、下降红箭头比裸数字直觉。人脑对颜色和方向敏感对数字迟钝。把数字翻译成颜色和方向报表就从档案变成仪表盘。二十一、报表与告警的边界报表是看历史告警是管当下。我们分清两者日报周报给人看趋势实时告警给责任人看异常。别把告警塞进日报看了也来不及也别把趋势塞进告警吵且无关。各司其职信息才不乱。边界清楚了人不会被无效信息淹没。很多系统被人嫌弃不是因为没信息是因为信息和告警混在一起重要的事被淹了。报表自动化顺手把这条边界也划清价值翻倍。二十二、最后一句报表自动化写到这本质是一句话让数据自己流动到该看它的人面前。小吴的故事证明当你不再被复制粘贴绑住你才有空做只有人能做的判断。如果你也想要这份自由明天就写第一个日报脚本。官网独享资源里的FAB日报生成器已经把最难的第一步铺好你只需改数据源就能迈出这一步。报表自动化的本质是把“你每天不得不做的事”变成“系统替你做的事”腾出的每一分钟都属于你自己的成长。——官网独享资源www.yezhihui.cn ——
返回列表