
简介一份由山东大学管理学院吴爱华教授主讲的工业工程IE培训课件面向工业工程、管理科学与工程、工程管理等专业的学生和从业者系统梳理工业工程学科的基本概念、特征、功能与特有意识并按概述、发展过程、主要内容、国内外应用概况四个模块展开帮助读者理解工业工程在生产制造、服务业和物流业中的实际应用。资源文件为1个pptx演示文稿压缩包总大小3.29MB内容结构清晰适合课堂展示或自学入门。已有101人学习浏览。课件围绕IE的系统设计、改进与实施逻辑讲解如何运用数学、物理学和社会科学知识优化由人员、物料、设备、能源和信息构成的集成系统并涵盖泰勒科学管理、吉尔布雷斯动作研究、福特流水装配线等经典案例同时强调成本和效率意识、问题和改革意识、工作简化和标准化意识等核心理念可帮助学习者快速建立工业工程知识框架理解系统优化与精细化管理的关键方法。1. 工业工程培训课件.pptx 不是文件是十几个 XML 塞进一个 zip 包把工业工程培训课件.pptx拖进压缩软件你会看到ppt/slides/slide1.xml、ppt/charts/chart1.xml、ppt/embeddings/下一排 xlsx。PPTX 的本质是 zip 容器套着 XML 描述文件课件里的每一段标准工时、每一条动作经济原则、每一个 OEE 数字在磁盘上都对应一段可被程序改写的 XML。工业工程培训课件恰恰满是编号、术语和数据手工一份份改要反复核对版本、术语、页脚。直接解包改 XML 够底层但容易破坏部件关系常见做法是用 python-pptx 这类封装好关系层的库把批量替换术语、更新图表数据、校验内容一致性当成数据治理来做。下面先拆开这个包再给出能直接跑的脚本最后收成一套可复用的课件更新流程。2. 拆开工业工程培训课件.pptx内部目录、关系文件与 python-pptx 的边界2.1 三个必看的内部目录slides、charts、embeddings解包的目的不是欣赏 XML而是知道改哪些文件、改完要同步什么。用一段 Python 把整份课件的部件清单打印出来比在 PowerPoint 里点“另存为”直观得多import zipfile with zipfile.ZipFile(工业工程培训课件.pptx) as z: for name in z.namelist(): print(f{z.getinfo(name).file_size:10} {name})输出里要格外注意这几类路径内部路径含义自动化时的用途[Content_Types].xml声明每个部件的 MIME 类型新增部件后必须同步否则打开报错ppt/presentation.xml幻灯片顺序p:sldIdLst决定页码调换页序、删页后要重写这个列表ppt/slides/slideN.xml每一页的具体文本术语替换、错别字检查的入口ppt/slideLayouts/、ppt/slideMasters/版式与母版页脚、水印通常在这里统一改“第 X 期培训专用”这类水印ppt/charts/chartN.xml图表类型与缓存的数据改图表标题、系列名称ppt/embeddings/*.xlsx图表背后的真实工作簿用 openpyxl 改数据源ppt/media/图片、照片检查是否有引用了但文件缺失的图片ppt/notesSlides/notesSlideN.xml讲者备注批量补培训导入语、讲师提示注意ppt/presentation.xml和ppt/slides/_rels/slideN.xml.rels这两类关系文件。rels 里记录着一页幻灯片引用了哪些图片、图表、版式。手工解包改 XML 时最常翻车的地方就是漏改 rels——文本改对了图片却全部消失PowerPoint 打开还会提示“需要修复”。2.2 为什么选 python-pptx 而不是直接改 XML裸改 XML 适合只读检查不适合写。slide1.xml里一段文字是a:p a:r a:t三层嵌套段落级属性在a:pPr字符级属性在a:rPr直接 replace 会把 run 的加粗、颜色、字体全毁掉。python-pptx 把这一整套关系封装成Presentation - slide - shape - text_frame - paragraph - run改run.text能尽量保留该 run 的格式。实际写入前先跑一遍只读脚本把每页文字导出来确认这份课件的文本到底分布在文本框、表格还是分组里from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE def iter_text_frames(shapes): 递归取出所有文本框普通文本框、表格单元格、分组内的文本。 for shape in shapes: if shape.shape_type MSO_SHAPE_TYPE.GROUP: yield from iter_text_frames(shape.shapes) if shape.has_text_frame: yield shape.text_frame if shape.has_table: for row in shape.table.rows: for cell in row.cells: yield cell.text_frame prs Presentation(工业工程培训课件.pptx) for idx, slide in enumerate(prs.slides, start1): for tf in iter_text_frames(slide.shapes): for para in tf.paragraphs: line .join(run.text for run in para.runs) if line.strip(): print(f第{idx}页: {line})这里MSO_SHAPE_TYPE.GROUP是分组形状的枚举值yield from负责递归钻进分组内部。工业工程课件常用的 CNOMO / 工艺流程图经常是一整个分组里面有十几个小文本框不递归就漏内容。提示代码里读para.runs拼接是为了拿到“段落实际文本”。直接读para.text也行但后续要改文本时必须知道文本分布在哪个 run 里所以这里先习惯用 run 维度。3. 批量修改工业工程培训课件run 级替换、页脚统一与期号水印3.1 术语一致化run 级替换脚本工业工程培训课件最容易出现的问题是一套术语三种叫法正文写“瓶颈工序”图表标题写“约束工序”结束页又变成“关键工序”。上级审核时逐页翻很费劲写脚本统一替换更可靠。from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE # 术语替换表旧词 - 新词按课件审核结论维护 replace_map { 瓶颈工序: 约束工序, 工作研究: 方法研究, 动作研究: 作业分析, } def replace_in_frame(tf, page): for para in tf.paragraphs: for run in para.runs: for old, new in replace_map.items(): if old in run.text: run.text run.text.replace(old, new) print(f第{page}页: {old} - {new}) prs Presentation(工业工程培训课件.pptx) for idx, slide in enumerate(prs.slides, start1): for tf in iter_text_frames(slide.shapes): replace_in_frame(tf, idx) prs.save(工业工程培训课件_术语修订版.pptx)为什么在 run 级替换而不是段落级替换para.text是拼接结果直接对它 replace 再写回会覆盖整个段落的 run 结构局部加粗、字体颜色会丢。run 级替换只改命中的那一段字符串损失最小。需要注意PowerPoint 输入时经常把一句话拆成多个 run比如“瓶颈”是一个 run“工序”是另一个 runold in run.text就会漏掉。遇到这种情况脚本扫描完提示“替换数量为 0”先别怀疑脚本打印第一处para.runs看拆分情况。3.2 页脚与版本号统一遍历 slide_masters 和 slide_layouts培训页脚一般放在母版或版式上不在具体幻灯片里。正文改完了页脚还挂着“V1.0 内部资料”审核人一眼就能看出版本没对齐。prs Presentation(工业工程培训课件_术语修订版.pptx) for layout in prs.slide_layouts: for tf in iter_text_frames(layout.shapes): for para in tf.paragraphs: for run in para.runs: if V1.0 in run.text: run.text run.text.replace(V1.0, V2.1) prs.save(工业工程培训课件_V2.1.pptx)prs.slide_layouts返回所有版式母版prs.slide_masters也要过一遍。实际课件里页脚文字有时直接画在版式上有时在母版里两层都跑一遍最稳妥。提示这一版替换后务必用 PowerPoint 打开确认母版里的页脚没有“V1.0”残留。母版上的文字有时以图形属性a:rPr的ins或字段代码存在run.text为空但显示出来是版本号这种情况要回到 PowerPoint 手工改。3.3 批量水印每页加“第 X 期培训专用”培训课件发出去之前通常要加水印区分批次。逐页复制文本框太慢脚本可以给每一页右上角加一个浅色标签from pptx.util import Pt, Emu from pptx.dml.color import RGBColor PRS_W prs.slide_width # 拿到页面宽度水印位置按比例算 for idx, slide in enumerate(prs.slides, start1): box slide.shapes.add_textbox( PRS_W - Emu(4572000), Emu(457200), # 右侧约 3.6 英寸处 Emu(3810000), Emu(457200) ) tf box.text_frame tf.text 第三期现场改善培训专用 for para in tf.paragraphs: for run in para.runs: run.font.size Pt(14) run.font.color.rgb RGBColor(0x99, 0x99, 0x99) prs.save(工业工程培训课件_第三期_水印版.pptx)add_textbox的前两个参数是左上角坐标后两个是宽高单位都是 EMU。这里用Emu(457200)换算成英寸是 0.5 英寸方便做相对定位。加水印后的文件建议再跑一遍第 2 章的只读脚本确认每一页都只有一个水印文本框避免叠加两次。4. 图表与公式python-pptx 够不着的两层用 zipfile 补上4.1 图表数据其实在嵌入的 xlsx 里工业工程课件里最常见的图表是“工时对比柱状图”和“OEE 趋势折线图”。在 PPTX 内部图表本体是ppt/charts/chartN.xml真正的数据却躺在ppt/embeddings/Microsoft_Excel_工作表.xlsx里。python-pptx 能改图表标题但对图表数据只有一份缓存直接调用chart.replace_data()只更新缓存里的数图表重新编辑时数据源仍是旧的。要真正改数据常见做法是解包后直接改嵌入的 xlsximport zipfile from io import BytesIO from openpyxl import load_workbook with zipfile.ZipFile(工业工程培训课件.pptx) as z: for name in z.namelist(): if name.startswith(ppt/embeddings/) and name.endswith(.xlsx): wb load_workbook(BytesIO(z.read(name)), data_onlyTrue) ws wb.active print(f{name} 维度: {ws.dimensions}) for row in ws.iter_rows(min_row1, max_rowmin(ws.max_row, 8), values_onlyTrue): print(row)data_onlyTrue拿的是公式计算后的缓存值ws.dimensions给出数据区域范围比如A1:D7。看到这几行输出就能确认图表数据源的结构哪些行是月份、哪些列是 OEE 百分比。4.2 回写工作簿并保持 zip 结构确认数据源后把修改后的工作簿写回原 zip 的同一路径。关键是保持 zip 内部其他文件不变只替换目标 xlsx 的字节import zipfile, shutil TARGET ppt/embeddings/Microsoft_Excel_工作表1.xlsx temp_xlsx BytesIO() wb.save(temp_xlsx) with zipfile.ZipFile(工业工程培训课件.pptx) as zin: items {name: zin.read(name) for name in zin.namelist()} items[TARGET] temp_xlsx.getvalue() with zipfile.ZipFile(工业工程培训课件_新OEE数据.pptx, w, zipfile.ZIP_DEFLATED) as zout: for name, data in items.items(): zout.writestr(name, data)写成“读全部部件 - 替换目标 - 新 zip 写出”而不是在原文件上原地改避免写一半断电导致整份课件损坏。替换后 PowerPoint 打开图表看到的数值是新的但图表样式、配色不会动。注意chartN.xml里保存了一份缓存数据PowerPoint 重新计算时会以嵌入工作簿为准。如果打开后图表没变把嵌入工作簿在 Excel 里打开另存一次再嵌回去这是最省事的兜底做法。4.3 公式OMML与 SmartArt能定位、别硬改工业工程课件里“线平衡率 各工序净时间总和 / (瓶颈工序时间 × 工序数)”这类公式在 XML 里是 OMMLOffice Math Markup Languagepython-pptx 不解析它shape.text_frame根本看不见公式内容。定位公式页可以用 zipfile 扫描import re, zipfile with zipfile.ZipFile(工业工程培训课件.pptx) as z: for name in z.namelist(): if name.startswith(ppt/slides/slide) and name.endswith(.xml): xml z.read(name).decode(utf-8) if m:oMath in xml: print(f{name} 包含 OMML 公式)不要试图用正则替换 OMML 里的系数——公式内部的m:t只是文本片段改动后很容易破坏数学结构。实操上遇到公式要更新直接在另一处用 Excel 或公式编辑器生成新公式导出 PNG 后插回原位置再把旧公式文本框删除。SmartArt 同理python-pptx 只能把它当作一个分组读取内部文本不暴露需要逐字改就回到 PowerPoint 里做。5. 内容一致性校验把课件当数据做检查5.1 术语混用统计先把全文导成词频批量替换完之后做一次反向检查统计全文里旧术语是否清零。把第 2 章的读取脚本改成词频统计输出每个术语的出现次数import re from collections import Counter from pptx import Presentation corpus [] prs Presentation(工业工程培训课件_第三期_水印版.pptx) for slide in prs.slides: for tf in iter_text_frames(slide.shapes): corpus.append(tf.text) full_text \n.join(corpus) terms re.findall(约束工序|关键工序|瓶颈工序|作业分析|动作研究, full_text) for term, count in Counter(terms).most_common(): print(f{term}: {count} 次)一次能看出“瓶颈工序”只剩 1 次、“约束工序”出现 14 次说明替换基本干净如果旧术语还有多处就定位文本所在页继续处理。词频统计比逐页人工核对快得多适合课件有几十页、每页三五个术语的场景。5.2 媒体引用完整性找出孤儿图片课件里的照片、流程图经常被误删或引用失效。PowerPoint 打开时会报“无法显示图片”但定位是哪一页很烦。用 zip 内文件清单和幻灯片关系做差集import zipfile from pptx import Presentation with zipfile.ZipFile(工业工程培训课件_第三期_水印版.pptx) as z: zmedia [n for n in z.namelist() if n.startswith(ppt/media/)] prs Presentation(工业工程培训课件_第三期_水印版.pptx) referenced set() for slide in prs.slides: for rel in slide.part.rels.values(): if image in rel.reltype: referenced.add(str(rel.target_part.partname)) orphans set(zmedia) - referenced if orphans: print(未被引用的图片文件) for name in sorted(orphans): print( , name) else: print(所有媒体文件均被引用)slide.part.rels.values()返回这一页的全部关系rel.reltype含image的就是图片关系。孤儿图片通常来自“删除图片但未清理媒体文件”的操作不影响播放但会白白增大文件体积压缩课件时一并清掉。5.3 日期与期号跨页一致性工业工程培训课件最隐蔽的错误是封面日期改成了新一期但考核安排、培训纪律、结束页还留着上一期日期。用正则把全文里的日期和期号全部抓出来对比是否只有一套dates re.findall(r20\d{2}年\d{1,2}月\d{1,2}日, full_text) editions re.findall(r第[一二三四五六七八九十\d]期, full_text) print(出现过的日期, sorted(set(dates))) print(出现过的期数, sorted(set(editions)))如果日期出现两个以上逐页翻找太慢配合第 3 章的 run 级替换统一改成目标日期即可。这个检查脚本可以每次发版前固定跑一遍当作课件发布的准入测试。6. 把整套流程收进 build.py模板加 JSON批量出当期待课件6.1 模板占位符与 JSON 数据源驱动前面的脚本解决的是“改这一份课件”。真正需要长期维护的是“每个月出一期培训课件”改动只有日期、讲师、车间、期数。把模板里的固定位置写成{{日期}}、{{讲师}}、{{车间}}、{{期数}}占位符再建一份schedule.json[ {edition: 第三期, date: 2026-01-16, trainer: 张工, shop: 总装车间}, {edition: 第四期, date: 2026-02-13, trainer: 李工, shop: 焊接车间} ]build.py 里复用第 2 章的iter_text_frames逐期生成独立 pptxfrom pptx import Presentation import json with open(schedule.json, encodingutf-8) as f: schedule json.load(f) for item in schedule: prs Presentation(工业工程培训课件_模板.pptx) # 模板只读每次重新加载 for slide in prs.slides: for tf in iter_text_frames(slide.shapes): for para in tf.paragraphs: for run in para.runs: run.text run.text.replace({{日期}}, item[date]) run.text run.text.replace({{讲师}}, item[trainer]) run.text run.text.replace({{车间}}, item[shop]) run.text run.text.replace({{期数}}, item[edition]) prs.core_properties.title f工业工程培训-{item[edition]} prs.save(f工业工程培训课件_{item[edition]}.pptx)模板必须作为只读输入每次循环重新Presentation(...)不能复用同一个对象——python-pptx 的模型在保存后仍然持有内存状态复用会叠加上一期的替换结果。core_properties.title会把期数写进文件属性Windows 资源管理器里不用打开文件就能区分版本。6.2 run 拆分导致占位符替换失效的修正模板里粘贴{{日期}}时PowerPoint 可能把大括号和字拆到两个 run。run.text.replace只扫描单个 run替换就会落空。检查方式打印某个占位符所在段落的para.runs如果超过一个 run说明被拆了。修正做法是先把整段文本合并进第一个 run再替换def replace_placeholder_in_para(para, placeholder, value): full .join(run.text for run in para.runs) if placeholder not in full: return False for run in para.runs: run.text para.runs[0].text full.replace(placeholder, value) return True代价是整段局部格式个别字红色、加粗会丢。占位符所在行一般就是“培训日期2026-01-16”这种纯文本格式统一能接受。6.3 批量自检zip 完整性加词频对比生成所有分期待课件后用 Python 标准库自带的 zip 测试命令逐份检查比打开 PowerPoint 快for f in 工业工程培训课件_*.pptx; do python -m zipfile -t $f donepython -m zipfile -t会读取整个 zip 的中央目录和每个条目CRC 不一致会直接报损坏。自检通过后再跑一遍第 5.1 节的词频脚本以模板为基线对比各份课件的期数、日期数量确认每一份都只剩当值。把差异控制在你预期的范围内这套流程才算真的长在课件产线上了。本文还有配套的精品资源点击获取