简介:装配工艺过程卡片.doc 面向简易升降机制造、安装与质检岗位的工程技术人员及职业院校机电专业学生,用于规范SJ-1000kg-0.13m/s型简易升降机轿厢部件的装配流程与检验依据。文件以工序流程为主线,逐条列出准备、清洗、装配轿架与轿底、装配轿壁、安装轿顶护栏和拉杆、平安钳装配、门机与轿门试装等环节,并给出垂直度不大于1.5mm、轿底水平度不大于3/1000等具体公差要求,同时标注所用榔头、铜棒、扳手、螺丝刀、油壶等工具与柴油清洗等辅助材料,配套编制、审核、会签栏便于现场签字确认。资源包仅含1个doc文档,约125KB,结构紧凑、便于打印下发到工位。已有191人学习下载,可作为装配工艺卡编制模板、现场作业指导或教学案例参考,帮助读者快速掌握简易升降机轿厢装配的工序划分、技术参数与质量控制要点。
1. 装配工艺过程卡片.doc 在车间里到底扮演什么角色
装配工艺过程卡片是装配工艺规程里的"过程卡",一张表按工序号从上往下排完整台产品的装配顺序:每行是一道工序,写着工序名称、装配内容、所用设备与工装、辅助材料、单件工时定额和检验要求。它和"工序卡片"不是一回事,过程卡只落到工序级,工序卡要细到工步、拧紧顺序或扭矩值。.doc这个后缀说明它是 Word 97-2003 的二进制格式,很多企业的模板从十几年前一路复制沿用到现在,工艺员在 Word 里手工填,车间打印下发,质检签字归档。麻烦也恰恰在这儿:手工填意味着串行、易错、难统计,一个型号改版就得把几十张卡片重排一遍,工时定额还常常对不上汇总表。把这张卡片拆成"模板 + 数据"两步,做成可批量生成、可校验、可归档的产物,是接下来要讲清楚的事。
2. 拆开 .doc 看装配工艺过程卡片的字段结构
2.1 过程卡与工序卡的分工,先定卡片里放什么
装配工艺过程卡片以"工序"为最小记录单位,一张卡覆盖一台产品或者一个部件从上线到出线的全部装配顺序。工序卡片则拆到工步级,写清每一颗螺栓的拧紧顺序、扭矩值、检测手段。常见做法是:过程卡随产品流转,给车间调度、计划、质检看;工序卡留在工位,给操作者看。把这两类卡片的边界划清,后面设计字段时才不会把扭矩值、拧紧顺序这类明细全塞进过程卡的单元格里——那样做出来的表会有几百行,Word 分页根本分不干净,跨页时一道工序被切两半。
字段设计上还有个隐藏命题:这张卡片未来要不要被 CAPP 或 MES 读。如果只是打印下发,工序内容可以写成自然段,人读得懂就行;如果后续要被程序解析、做工时汇总、做工装齐套检查,工序内容就得拆成结构化短句甚至带参数字段。先问清楚这一点,再动手排表,能省掉后面一次返工。
2.2 表头区、表体列与一张可检索的字段清单
表头区放的是"一次装配任务的身份信息",表体区放的是"重复出现的工序行"。这两块在 Word 里通常是一张表上下拼在一起,用合并单元格隔开,表头行跨页时还要重复出现。
| 区域 | 字段名 | 常见取值示例 | 类型 | 备注 |
|---|---|---|---|---|
| 表头 | 产品代号 | XY-2401 | 文本 | 参与文件命名,禁止含空格 |
| 表头 | 产品名称 | 减速箱总成 | 文本 | 与图样名称一致 |
| 表头 | 部件图号 | XY-2401-00 | 文本 | 与 PLM 图号对齐 |
| 表头 | 版次 | A/1 | 文本 | 改版必须递增 |
| 表头 | 编制/审核/批准 | 姓名 | 文本 | 签字栏随版次重签 |
| 表体 | 工序号 | 10 | 文本 | 十位步进,不是数字 |
| 表体 | 工序名称 | 箱体清洗 | 文本 | 动宾结构,不超过 8 字 |
| 表体 | 工序内容 | 1) 清洗 2) 吹干 | 文本 | 工步写在同一格内换行 |
| 表体 | 设备/工位 | 清洗机 / 工位 3 | 文本 | 与设备台账编码一致 |
| 表体 | 工艺装备 | 工装 GZ-018 | 文本 | 工装、量具、夹具分列或合并 |
| 表体 | 单件工时定额 | 12 | 数值 | 单位全厂统一为 min |
| 表体 | 检验要求 | 目视无残留 | 文本 | 关键工序必填 |
| 表体 | 关键工序 | Y / N | 枚举 | 用于筛选专检点 |
提示:工时定额的单位必须全厂统一,常见做法是在表头注明"工时单位:min",而不是在每一行后面加单位,否则汇总脚本每次都要做字符串清洗。
2.3 工序号编码规则与工步的写法
工序号用十位步进:10、20、30、40……插入新工序时用 15、25 补位,不必整表重排。这是离散制造里非常通用的做法,好处是卡片改版时工序号基本不变,车间看板、工位器具上的编号也不用跟着换。如果从 1 开始连续编号,中间插一道工序就得把所有后续编号全改一遍,历史版次对不上,追溯直接断链。
工步写在"工序内容"单元格里,用 1)、2)、3) 分行,不要另开表体行。另开行会让表格行数翻倍,更重要的是跨页时会把同一道工序的工步切开,操作者看到半道工序还得翻页。同一工位连续完成的动作可以合并成一道工序,写清"装配—自检"闭环,把自检要求一并写进工序内容。
2.4 .doc 二进制格式对结构化处理意味着什么
Word 97-2003 的.doc是 OLE 复合文档,正文文本存在WordDocument流里,和.docx的 OOXML 压缩包完全两套结构。python-docx只认.docx,直接打开.doc会报包结构错误。所以处理老.doc的路子只有两条:先转成.docx再操作,或者用 Word 的 COM 接口直接驱动。
前者适合批量处理、服务器上没有装 Office 的场景,转换工具用 LibreOffice 命令行即可;后者适合需要保留原.doc版式、必须原样另存的场景,代价是依赖 Windows 和本机 Word。这个判断决定了后面整条流水线的形态,选错了会在部署阶段反复返工。
3. 用 Python 从 Excel 工艺数据批量生成 .doc 卡片
3.1 源数据表怎么设计才不用回头改模板
Excel 一行对应一道工序,列名和卡片字段一一对应。不要出现"工序号 / 工步1 / 工步2 / 工步3"这种横向展开的写法——工序数一变列数就得变,模板跟着作废。工步全部塞进"工序内容"这一格,用换行符分隔。
工作簿建议分两张 sheet:一张"工序明细"放表体和表头字段,一张"工装字典"放工装编码与名称的对应关系。卡片里只写编码,打印前用字典关联出名称,这样工装改名时不用批量改卡片。
3.2 模板占位符与字段映射表
模板用.docx做,先把表头填空处写成 Jinja2 占位符,数据行写成循环标记。
| 数据列 | 模板占位符 | 渲染位置 | 校验要求 |
|---|---|---|---|
| 产品代号 | {{ 产品代号 }} | 表头 | 非空、无空格 |
| 产品名称 | {{ 产品名称 }} | 表头 | 非空 |
| 版次 | {{ 版次 }} | 表头 | 递增 |
| 工序号 | {{ r.工序号 }} | 表体循环行 | 唯一、递增 |
| 工序内容 | {{ r.工序内容 }} | 表体循环行 | 用 RichText 处理换行 |
| 单件工时定额 | {{ r.单件工时定额 }} | 表体循环行 | 正数 |
| 检验要求 | {{ r.检验要求 }} | 表体循环行 | 关键工序必填 |
数据行的循环标记写在表格行里:在样板行的第一格放{%tr for r in rows %},最后一格放{%tr endfor %}。tr前缀是 docxtpl 的表格行指令,渲染时会整行复制或删除,而不是只在单元格里做文本替换。
3.3 docxtpl 渲染 + LibreOffice 转 .doc 的完整脚本
# gen_card.py 从 Excel 批量生成装配工艺过程卡片 import pandas as pd from docxtpl import DocxTemplate, RichText from pathlib import Path SRC = "装配工艺数据.xlsx" TPL = "装配工艺过程卡片_模板.docx" OUT = Path("out"); OUT.mkdir(exist_ok=True) # 工序号按文本读,避免 Excel 把 10 读成 10.0 df = pd.read_excel(SRC, sheet_name="工序明细", dtype={"工序号": str, "产品代号": str, "版次": str}) # 关键字段缺失直接拦住,不出文件 need = ["工序号", "工序名称", "工序内容", "单件工时定额"] missing = df[df[need].isna().any(axis=1)] if not missing.empty: raise SystemExit(f"源表存在空字段,涉及 {len(missing)} 行,先补齐再生成") for (pcode, pname, ver), grp in df.groupby(["产品代号", "产品名称", "版次"], sort=False): rows = [] for _, r in grp.iterrows(): rows.append({ "工序号": r["工序号"], # RichText 会把 \n 渲染成单元格内换行,普通占位符不会 "工序内容": RichText(str(r["工序内容"])), "工序名称": r["工序名称"], "设备": r.get("设备", ""), "工艺装备": r.get("工艺装备", ""), "单件工时定额": int(r["单件工时定额"]), "检验要求": r.get("检验要求", ""), }) tpl = DocxTemplate(TPL) tpl.render({ "产品代号": pcode, "产品名称": pname, "版次": ver, "工序总数": len(rows), "rows": rows, }) tpl.save(OUT / f"{pcode}_{pname}_装配工艺过程卡片_{ver}.docx") print(f"生成 {len(list(OUT.glob('*.docx')))} 个 .docx,待转 .doc")脚本逻辑分三段:读源表并按产品+版次分组;每组把工序行整理成rows列表,其中"工序内容"包一层RichText,因为普通占位符里的\n在 Word 中不会换行;最后逐个渲染保存。参数上,dtype里显式指定工序号为str是关键,漏掉这一步,Excel 里看着是"10"的值进到 DataFrame 会变成10.0,卡片上就多出一个小数点。groupby的sort=False保证输出顺序和源表一致,不然渲染出来的卡片顺序会按产品代号重排,跟工艺员习惯的顺序对不上。
转.doc用命令行即可:
soffice --headless --convert-to doc:"MS Word 97" --outdir out_doc out/*.docx--headless表示不弹窗口,doc:"MS Word 97"里的过滤器名必须写全,只写doc在新版 LibreOffice 上也能过,但指定过滤器可以避免被默认导出成别的格式。--outdir目录要先存在。
3.4 win32com 直接写 .doc 的备选路径
如果版式必须原样保留,或者公司模板里嵌了 OLE 对象(比如插入的工艺简图),走 Word COM 更稳:
import win32com.client as win32 word = win32.gencache.EnsureDispatch("Word.Application") word.Visible = False try: doc = word.Documents.Open(r"D:\out\XY-2401_减速箱总成_装配工艺过程卡片_A1.docx") # FileFormat=0 即 wdFormatDocument,对应 Word 97-2003 的 .doc doc.SaveAs2(r"D:\out\XY-2401_减速箱总成_装配工艺过程卡片_A1.doc", FileFormat=0) doc.Close(False) finally: word.Quit() # 必须放在 finally,异常时不留后台 Word 进程EnsureDispatch的好处是会生成类型库缓存,SaveAs2的常量名能自动补全;用Dispatch也行,但只能传数字常量。word.Quit()必须放在finally里,一旦中途抛异常,后台会残留一个WINWORD.EXE,跑几百个文件之后内存直接吃满。
3.5 参数说明:行高、字体、分页与表格自动扩展
模板阶段一次性定好这些,比在代码里改省事得多:表头用黑体小五、表体用宋体小五,行距设固定值 14 磅,不然行数一多行高会跳。表格列宽全部固定,并在表格属性里关闭"自动调整尺寸以适应内容",否则一旦工序名称字数超预期,整个表格的列宽会重排,打印出来对不齐装订线。表头行勾选"重复标题行",卡片超过一页时第二页自动带表头。数据行不要设"段前分页",靠表格自然分页,硬分页会在工序中间断开。
4. 老 .doc 的读写坑:转换、复制行与版本受控
4.1 .doc 与 .docx 互转的命令行做法
除了上面正向生成,反向读取老卡片也常要做——比如把历史.doc卡片提取成 Excel 做工时汇总:
# 老 .doc 批量转 .docx,便于 python-docx 读取 soffice --headless --convert-to docx --outdir work_docx incoming/*.doc # 多实例并发时隔离配置目录,避免抢占 soffice --headless -env:UserInstallation=file:///tmp/lo_1 \ --convert-to docx --outdir work_docx incoming/*.docLibreOffice 同一时刻只允许一个实例持有默认用户配置目录,批量转换时如果起多个进程,后来的会静默失败,输出目录里少文件但不报错。用-env:UserInstallation给每个进程指一个独立目录就能并发。另一个坑是文件名:源卡片名里带空格或中文括号时,shell 通配符展开没问题,但传进某些封装脚本会被截断,稳妥做法是先重命名成 ASCII 名再转,转换后用文件名映射表改回来。
4.2 python-docx 动态加行必须用 deepcopy
python-docx 没有"插入行"的 API。table.add_row()加出来的行是空的,拿不到模板行里的单元格宽度、底纹、字体和合并信息,生成出来会很难看。正确做法是复制模板行的底层 XML:
import copy from docx import Document doc = Document("装配工艺过程卡片_模板.docx") table = doc.tables[0] proto = table.rows[2] # 第 3 行作样板数据行 for rec in records: new_tr = copy.deepcopy(proto._tr) # 连 XML 一起拷,样式才跟得过来 table._tbl.append(new_tr) row = table.rows[-1] for idx, col in enumerate(["工序号", "工序名称", "工序内容"]): row.cells[idx].text = str(rec[col]) table._tbl.remove(proto._tr) # 最后删掉样板行 doc.save("out.docx")关键点是_tr这一层。直接deepcopy(row)拷的是 python-docx 的封装对象,追加回表格时没有挂载点,样式会丢。拷row._tr再append到table._tbl才是操作底层 XML。追加的位置永远是表尾,如果模板下方还有签字行,需要改成proto._tr.addnext(new_tr)逐行插入,顺序才不会乱。删样板行的动作必须放在所有插入之后,否则proto引用失效。
4.3 批量替换与串档:编号、图号、版次的正则处理
改版时最常见的操作是全文替换图号,而这是串档的高发区。图号XY-24是XY-2401的前缀,str.replace("XY-24", "XY-25")会把XY-2401一起改成XY-2501,一张卡片的图号全错。安全做法是加词边界或者在单元格级别精确匹配:
import re # 只在图号是完整 token 时替换,后面不能紧跟数字或连字符 pattern = re.compile(r"XY-24(?![\d-])") new_text = pattern.sub("XY-25", cell.text)更稳的路子是避开文本替换,直接按字段重新渲染——数据源里的图号改了,重新生成一遍卡片就行,不碰替换逻辑。版次同理,不要用替换改版次标记,走数据源。
4.4 生成流水线的排错对照表
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 打开 .doc 提示格式不一致 | 模板是高版本 .docx,另存时没指定过滤器 | 转换时显式写doc:"MS Word 97" |
| 工序号变成 10.0 | pandas 把编号列推断成浮点 | 读取时dtype={"工序号": str} |
| 生成后表格列宽跳动 | 单元格未固定列宽,开启自动调整 | 关闭自动调整,列宽写死 |
| 第二页没有表头 | 未设置标题行重复 | 布局 → 重复标题行 |
| 单元格内工步没有换行 | 占位符渲染不处理\n | 值包一层RichText |
| 批量转换少文件且无报错 | LibreOffice 实例抢占配置目录 | 加-env:UserInstallation隔离 |
| 后台残留 WINWORD.EXE | Quit()未放 finally | 异常路径也要释放进程 |
注意:排错时先确认拿到的是
.doc还是.docx。同一批文件后缀混装时,转换脚本会静默跳过不认识的文件,用它生成的汇总数往往比实际少,别急着怀疑数据源。
5. 让卡片成为视图:装配工艺卡片的字段校验与数据回流
工艺卡片一旦改成批量生成,源表就成了唯一数据源,卡片只是它的一次渲染结果。这时候把校验前移,比事后对着打印稿挑错划算得多。下面这段脚本挂在生成之前,退出码非零就不出文件:
import pandas as pd df = pd.read_excel("装配工艺数据.xlsx", sheet_name="工序明细", dtype={"工序号": str}) errs = [] for pcode, grp in df.groupby("产品代号", sort=False): nums = grp["工序号"].tolist() if len(set(nums)) != len(nums): errs.append(f"{pcode}: 工序号重复") # 十位步进,字符串排序不等于数值排序,要按 int 比 if nums != sorted(nums, key=int): errs.append(f"{pcode}: 工序号未按十位递增") hours = pd.to_numeric(df["单件工时定额"], errors="coerce") for i in hours[hours.isna() | (hours <= 0)].index: r = df.loc[i] errs.append(f"{r['产品代号']} 工序{r['工序号']}: 工时定额缺失或非正") key = df[df["关键工序"].astype(str).str.upper().eq("Y")] for _, r in key.iterrows(): if pd.isna(r["检验要求"]) or not str(r["检验要求"]).strip(): errs.append(f"{r['产品代号']} 工序{r['工序号']}: 关键工序缺检验要求") print("\n".join(errs) if errs else "校验通过") raise SystemExit(1 if errs else 0)三类规则覆盖了工艺卡片最常被退回的原因:编号体系乱、工时定额对不上汇总、关键工序漏挂检验要求。工序号比较这里有个细节,sorted(nums)按字符串排会把 "100" 排在 "20" 前面,必须显式写key=int。工时用pd.to_numeric(..., errors="coerce")转一遍,源表里混进"待定"这类文字时会变成 NaN,能被同一条规则抓到,不用另写分支。
版次改动后,工艺员最关心的是"这次到底改了哪几行"。把两次生成的卡片文本导出来做一次差分,比人眼逐行对快得多:
import difflib a = open("v1.0.txt", encoding="utf-8").read().splitlines() b = open("v1.1.txt", encoding="utf-8").read().splitlines() print("\n".join(difflib.unified_diff(a, b, "A/1", "A/2", lineterm="")))文本从.docx里抽,遍历表格的row.cells[0].text + "|" + row.cells[2].text逐行拼就行,工序号和工序内容一起进比对,工序内容改了但工序号没动的情况也能看出来。归档阶段再把.doc转一份 PDF 存到受控目录,.doc留给车间改版,PDF 冻结当次签字版,纸质打印从 PDF 出,避免打印时字体替换导致表格错行。最后把校验脚本和生成脚本放进同一条流水线,源表提交时先跑校验、再出.docx、转.doc、转 PDF,四步串起来,中间任何一步失败都停在原地,别让半成品流到车间。
本文还有配套的精品资源,点击获取