上季度新项目要出采购 BOM,EPLAN 的部件汇总表导出来一看,采购直接打回来了:同一个 9A 交流接触器在库里躺着三种写法——3RT2016-1BB41、3RT2 016-1BB41(订货号中间多了个空格)、还有一条类型描述写"西门子接触器 9A"、订货号栏是空的。对不上 SAP,三行里只有一行能下单。
统计了一下,库里 3142 条部件数据,是五年间三个项目组、至少四代工程师手攒出来的。这篇文章记录一次完整的部件库批量清洗:全量导出 → Excel 规范化 → 按零部件编号回灌 → 项目端验证,每一步的规则和踩过的坑都在,可以直接照抄。
一、先纠正一个认知:项目备份救不了部件库
很多人以为部件数据在项目里,项目备份了就万事大吉。不是。EPLAN 的部件数据存放在独立的部件数据库文件里(路径在:选项 > 设置 > 管理 > 部件,能看到数据库文件的完整路径)。每次项目备份都成功,只代表图纸安全,部件库该坏还是坏。
所以动手前先做双保险:
- 部件管理里全量导出一份 XLS,命名
parts_backup_20261101.xls,这是回滚点; - 直接复制一份部件数据库文件到备份目录。两个都做,成本一分钟。
二、全量导出
路径:工具 > 部件 > 管理(打开部件管理对话框)→ 导入/导出 → 导出,范围选"全部",格式 XLS。(我用的是 2.9;老版本菜单位置略有差异,但都在部件管理对话框里的导入/导出。)
导出的表每行一个部件,几十列。不用全看,清洗只盯下面这几列。
三、Excel 清洗:四类脏数据对症下药
导出表拉到 Excel 里先做透视统计,脏数据基本就四类:
| 脏数据类型 | 典型表现 | 清洗手段 |
|---|---|---|
| 空格 / 不可见字符 | 3RT2 016-1BB41 | SUBSTITUTE 去所有空格 + TRIM/CLEAN |
| 制造商别名 | Siemens / SIEMENS / 西门子 是"三家" | 别名映射表 VLOOKUP 归一 |
| 缺关键字段 | 订货号为空、类型描述顶替 | 按制造商+型号描述半自动补录 |
| 重复部件 | 同一订货号多条,编号不同 | 按订货号+制造商判重,合并保留一条 |
具体操作步骤(照抄版)
第 1 步:先把订货号整列设为"文本"格式(分列向导里选文本,或设置单元格格式后重新粘贴)。为什么放第一步,看第五节的坑 1。
第 2 步:去空格。函数版:
=TRIM(CLEAN(SUBSTITUTE(B2," ","")))SUBSTITUTE 连订货号中间的空格一起去掉——订货号里的空格本来就是手误,SAP 里没有它。用 Power Query 的话:替换值" "→"",再加一步"清除文本空格"。
第 3 步:制造商归一。另建一张两列映射表(别名 → 标准名),例如 Siemens / SIEMENS / 西门子 / SIEMENS AG 全部映射到西门子:
=IFERROR(VLOOKUP(C2,厂商映射!A:B,2,0),"!!人工确认!!")映射不上的吐!!人工确认!!,筛选出来人工过——宁可人工过,不要让它静默进库。
第 4 步:判重。按"制造商+订货号"做辅助列拼接,条件计数>1的整批筛出来人工合并:决定保留哪条零部件编号(别的项目可能引用了它),把其余条目的有用字段并进保留条目再删除。
第 5 步:长度校验兜底:
=IF(LEN(B2)<6,"!!订货号疑似异常!!","")筛出来的逐条核对,大概率是当初录了半截的。
四、字段映射表
回灌前对着这份映射表把列收拾干净(列名以导出表实际表头为准,不同版本叫法略有出入):
| Excel 列 | 对应部件字段 | 清洗/校验规则 |
|---|---|---|
| 零部件编号 | 零部件编号 | 全库唯一主键;格式统一<厂商缩写>-<订货号> |
| 订货号 | 订货号 | 文本格式;去全部空格;转大写;长度校验 |
| 制造商 | 制造商 | 只允许映射表里的标准名 |
| 类型描述 | 类型描述 | 保留中文;去换行符与尾空格 |
| 单位 | 单位 | 枚举校验(个/套/台/PC) |
| 包装数量 / 价格 | 包装单位 / 价格 | 去千分位逗号与货币符号,转纯数值 |
| 宏 / 图形符号路径 | 宏 | 核对路径存在;失效置空,不让死路径进库 |
| 备注 | 备注 | 自由文本,只清理乱码 |
五、六个真实的坑
- Excel 把长订货号变成科学计数法:纯数字订货号如
6108260012345678,Excel 自作主张显示成6.10826E+15,一旦按这个值保存,订货号就永久损坏。这就是为什么"设文本格式"必须放在清洗第一步。 - 前导零丢失:
0079A123变成79A123还能看出来,纯数字的0079123456直接变79123456,根本发现不了。同上,文本格式解决。 - 制造商别名分裂统计:Siemens、SIEMENS、西门子在部件汇总里是三个厂商,BOM 按厂商分组就裂成三行。不归一,清洗等于白做。
- 导入时没选"更新已有部件":第一次回灌我没确认这个选项,系统按"新增"处理,库里直接翻出一套重复记录,只能拿第 1 节的备份回滚重来。导入匹配方式必须选"按零部件编号更新已有部件"。
- 宏路径是绝对路径:老库里的宏指向
D:\盘的旧目录,换机后全失效。清洗表里核对路径存在性,失效就置空,等有宏了再补。 - 价格列带格式:
"1,234.50"这种带千分位甚至带货币符号的值,导入会报错或截断成 1。清洗时统一转纯数值。
六、回灌与项目端验证
清洗表另存为 XLS(老版本对 XLSX 支持不稳,统一 XLS 少生枝节),部件管理 → 导入/导出 → 导入,匹配方式选"按零部件编号更新已有部件",先导一个小批次(比如只导西门子品牌约 400 条)验证。
验证闭环:
- 部件管理里随机抽 20 条,对比备份表确认字段正确;
- 打开一个在产项目,执行更新部件数据(部件数据同步),让项目引用指向清洗后的条目;
- 重新导出一次部件汇总/BOM,确认同一订货号的接触器合并成了一行——这一步通过,采购那边才算认账。
我们全量清洗+回灌+验证用了大半天,其中一半时间花在第 3 节的人工确认上,值。
七、结论与预防
一次清洗救不了下一代数据。收尾时定了三条规矩,之后两个季度库没再脏回去:
- 零部件编号唯一格式:
<厂商缩写>-<订货号>,新部件入库前先在导出表里查重; - 制造商白名单:只允许映射表里的标准名,映射表本身作为受控文件维护;
- 季度例行:每季度全量导出存档一次,与上季度 diff,新增条目人工过目,30 分钟完事。
部件库干净了,BOM 才能一键出。这每季度 30 分钟的例行,比每次出 BOM 前采购打回来、再花两小时人肉对号划算得多。