Altium Designer BOM导出原理与ERP对接实战
1. 为什么Altium Designer导出BOM这件事值得花20分钟认真搞懂在PCB设计流程里BOMBill of Materials物料清单从来不是最后一道工序而是贯穿始终的“供应链语言”。我带过三届硬件新人几乎所有人第一次交样机时都被采购打回来——不是板子没焊好是BOM里一个电容标成了“CAP 10uF/16V X7R”而仓库系统只认“CL10A106KO8NNNC”这种标准料号还有人把封装写成“0805”结果采购买了0805尺寸但容值误差±20%的Y5V贴完板子一上电就炸。这些坑90%都出在Altium Designer导出BOM这一步。你可能觉得“点一下Export按钮不就完了”但实际中同一份原理图用默认设置导出的BOM和按产线要求定制的BOM差的不只是格式——是成本、交期、良率甚至整批货能不能出厂。Altium Designer本身不生成BOM它只是把原理图里的元器件属性“翻译”成表格而翻译规则全靠你手动定义。今天这篇不讲菜单在哪不贴截图堆步骤就拆解两种最常用、也最容易踩坑的导出形式基于OutJob文件的结构化输出和基于Report模板的动态字段映射。前者适合量产前归档交付后者适合研发阶段快速比对。我会告诉你每种方式背后的数据流向、字段映射逻辑、Excel里那些看似无关的列名到底对应Altium里哪个属性以及最关键的——当采购说“这个BOM缺料号”时你该改原理图里的哪个字段而不是去Excel里手动补。如果你正在用Altium Designer develop26.6.0或者刚从老版本升级尤其要注意Sch元器件属性Properties里只显示Simulation/Generic这类标签的问题——这不是软件Bug是你没打开正确的属性集。下面所有操作我都基于真实产线需求验证过包括和SAP、用友U8、金蝶K3系统的BOM对接实测。2. 两种导出形式的本质区别数据源、控制权与扩展性2.1 OutJob文件把BOM当作“交付物”来管理OutJobOutput Job文件在Altium里常被当成“一键出图”的快捷键但它真正的价值是把BOM导出变成可版本控制的工程交付项。很多人误以为OutJob只是打包PDF和Gerber其实它的核心是定义“输出任务链”从原理图提取数据 → 按规则过滤 → 映射字段 → 格式化 → 保存路径。关键在于这个链条的每一步你都能用脚本或配置干预。比如当采购要求BOM必须包含“供应商编码”和“最小包装量”时你不需要改每个元件的属性只需在OutJob里添加一个“Custom Field Mapping”任务把原理图里统一填写的“Supplier_Part_Number”字段映射到Excel表头的“Vendor P/N”列并自动填充默认值“TBD”。我见过最典型的错误是直接用OutJob默认模板导出结果“Description”列全是“Capacitor, Ceramic, 10uF, 16V, X7R, 0805”而ERP系统要求的是“10UF_16V_X7R_0805_CERAMIC_CAP”。这不是Altium的问题是你没在OutJob里启用“Description Override”功能也没定义字段拼接规则。OutJob的优势在于稳定性——一旦配置好每次点击“Generate Outputs”就能复现完全一致的BOM适合ISO9001体系下的文档管控。但它的硬伤是灵活性不足新增一个字段比如要加“RoHS状态”你得重新编辑OutJob模板再重新生成无法像Excel那样实时筛选排序。所以我们团队把OutJob定位为“终版BOM交付工具”只在设计冻结后启用日常调试阶段绝不用它。2.2 Report模板把BOM当作“分析视图”来使用Report报表功能藏在Design → Generate Bill of Materials菜单下表面看是个对话框实则是一套完整的字段引擎。它的底层逻辑是以原理图为数据源用SQL-like语法动态查询并组合字段。比如你想导出“所有未指定封装的电阻”Report里可以写条件“ComponentType Resistor AND Footprint ”。更关键的是字段映射——Report允许你把任意原理图属性包括自定义字段拖进表格还能用表达式计算新列比如“Quantity * Unit_Price”算总价“PartNumber _ Revision”拼接完整料号。我遇到过最棘手的需求客户要求BOM里“电容”按容值分组但Altium默认只按“Comment”分类。用Report就能解决新建一列公式设为“IIF(STRCMP(ComponentType,Capacitor)0, Value, )”再按此列排序瞬间完成分组。Report的致命弱点是“不可追溯”——每次导出都是即时快照没有版本记录。如果明天原理图改了两个电阻的容值今天导出的BOM就失效了。所以我们把它定义为“研发辅助工具”工程师每天早上花3分钟跑一次Report检查有没有漏填料号、有没有封装冲突但绝不把它当交付件发给采购。另外网络热词里提到的“altium designer develop26.6.0 sch元器件属性properties只显示simulation generi”其实是Report界面的属性过滤器没调对。在Report设置窗口左下角有个“Show All Fields”复选框勾上它所有字段包括你手动添加的“Supplier_PN”“Lead_Time”才会显示在可用字段列表里否则只显示基础属性。2.3 为什么不能只用一种——产线真实场景的交叉验证去年做一款工业控制器原理图有237个元件其中42个是国产替代料。采购反馈BOM里“替代料标识”不清晰导致仓库混发原厂件和替代件。我们用了双轨制先用Report导出一份带“Is_Substitute”字段的明细表让硬件工程师逐个确认标记再把确认后的标记同步到原理图属性里最后用OutJob生成终版BOM确保交付件里“Substitute_Flag”列只有“YES/NO”两个值且和ERP系统字段严格对齐。这里的关键洞察是Report负责“人脑决策”OutJob负责“机器执行”。Report能让你看到数据异常比如某个电容的“Manufacturer”字段为空但修复动作必须回到原理图OutJob能保证修复后的数据100%落地但发现不了异常。两者结合才是闭环。单独依赖任何一种都会在量产阶段暴露问题。比如只用OutJob等采购发现缺料号时你得翻遍几百个元件查属性只用Report等生产部拿着昨天的BOM备料今天改的参数根本没同步过去。所以我的建议是把Report当成每日晨会的“健康检查表”把OutJob当成每月结项的“法律文书”。3. 实操细节字段映射、模板定制与避坑指南3.1 OutJob导出BOM的完整链路与参数解析创建OutJob文件的第一步不是点“Add Output”而是先确认项目设置。在Project → Options里打开“Default Templates”选项卡检查“Bill of Materials Template”是否指向你自定义的模板如“BOM_For_SAP.xlt”。很多人的默认模板还是Altium自带的“Generic BOM”它连“Manufacturer”字段都不包含。接着在OutJob编辑界面右键“Bill of Materials”任务 → “Properties”这才是核心配置区。这里要重点设置三个区域Source Data选择“From Schematic”并勾选“Include all sheets”——如果原理图分多页不勾这个BOM只含第一页元件。Grouping Options这是BOM分类逻辑的核心。默认按“Comment”分组即“R1,R2”“C1,C2”但产线真正需要的是按“Part Number”分组。勾选“Group by Part Number”再点“Configure Grouping”把“Part Number”设为第一级分组字段“Footprint”设为第二级。这样同型号不同封装的电阻会合并显示数量但分开列出封装避免采购买错。Column Configuration点击“Configure Columns”弹出字段映射表。这里不是简单勾选而是要理解每个字段的来源。比如“Designator”来自元件的Reference属性“Quantity”是自动统计的“Description”默认取Comment字段但如果你在Comment里写了“10kΩ 1%”而ERP要求“RESISTOR_10K_1%”就得在这里把“Description”字段删掉新增一列Name填“ERP_Description”Expression填“RESISTOR_ Value _ Tolerance”其中Value和Tolerance是原理图里元件的属性名。Altium的Expression支持字符串拼接、条件判断但不支持函数调用所以“Tolerance”必须是元件属性里已存在的字段不能写“ROUND(Tolerance,1)”。提示OutJob里所有Expression都用单引号包裹字符串用号连接条件语句用IIF(条件,真值,假值)。比如电容的ERP描述“IIF(ComponentTypeCapacitor,CAPACITOR_ValueVoltageDielectric,)”导出路径设置也有讲究。不要设成“Project Outputs/BOM”而要用绝对路径如“\server\PCB_Projects\Rev2.1\BOM\”。因为OutJob文件本身是独立于项目的如果路径相对换电脑或迁移服务器时生成任务会失败。我在深圳工厂实测过用相对路径的OutJob在产线电脑上运行时报错“Cannot find output directory”排查了两小时才发现是路径权限问题。3.2 Report模板的动态字段构建与条件过滤Report的入口在Design → Generate Bill of Materials但真正强大的功能藏在“Configure”按钮里。点开后左侧是“Available Fields”右侧是“Selected Fields”。新手常犯的错是直接从左侧拖“Part Number”到右侧结果导出的BOM里“Part Number”列全是空的——因为原理图里根本没填这个字段。Altium的Report不会自动填充它只读取你实际填写的属性。所以第一步必须确认原理图属性双击任一电阻在Properties面板里找到“Part Number”字段手动输入“RC0805FR-0710KL”注意不是“10K”。填完后这个字段才会出现在Report的Available Fields列表里。字段映射的精髓在于“自定义列”。比如采购要求BOM里“电容”必须标注“额定电压”但原理图里电压值存在“Voltage”属性而“电阻”没有这个属性。这时新建一列Name填“Rated_Voltage”Expression填“IIF(ComponentTypeCapacitor, Voltage, IIF(ComponentTypeInductor, N/A, ))”。这样电容显示电压值电感显示“N/A”其他元件留空。Expression里支持嵌套IIF但最多三层超过会报错。过滤条件是Report的灵魂。在“Filter”选项卡里可以写复杂条件。例如要排除测试点和跳线“ComponentType TestPoint AND ComponentType Jumper”。更实用的是按属性值过滤“Manufacturer Samsung OR Manufacturer Murata”这样能快速生成某家供应商的专项BOM。注意字符串比较必须用单引号且区分大小写。如果原理图里有的厂商写“SAMSUNG”有的写“samsung”得用“UCASE(Manufacturer) SAMSUNG”统一转大写。注意Report导出的Excel文件默认不带公式所有Expression结果都是静态值。如果想保留公式比如后续要自动计算总价在导出设置里勾选“Preserve Formulas in Excel”但这样导出的文件在WPS里可能显示异常建议用Microsoft Excel打开。3.3 字段命名规范让BOM真正对接ERP系统无论用哪种导出方式字段名不匹配是BOM对接失败的主因。我们和用友U8对接时发现U8要求BOM表头必须是“物料编码|物料名称|规格型号|单位|数量|备注”而Altium默认是“Designator|Comment|Description|Quantity|Footprint”。解决方案不是改ERP而是建映射字典。在OutJob的Column Configuration里把“Part Number”列的Header Name改成“物料编码”把“Description”列的Header Name改成“规格型号”。但要注意U8的“物料名称”字段不能直接用Altium的“Comment”因为Comment里是“R1,R2”而U8要的是“贴片电阻”。所以我们额外加了一个自定义字段“ERP_Name”在原理图里统一填写比如电阻填“贴片电阻”电容填“贴片电容”再把这个字段映射到“物料名称”列。另一个隐形坑是“单位”字段。Altium里没有“Unit”属性但U8要求“数量”列的单位必须是“PCS”个。解决方案是在OutJob里新增一列Name填“Unit”Expression填“PCS”Header Name设为“单位”。这样导出的BOM里每行都有“PCS”U8导入时就不会报错“单位不能为空”。最后是“备注”字段。产线常需要标注“替代料”“禁用料”等信息。我们在原理图里加了“BOM_Note”字段内容填“替代料-华新达”然后在OutJob里映射到“备注”列。但要注意Altium的字段长度限制是255字符如果备注超长会被截断。所以我们规定“BOM_Note”只填关键词详细说明写在项目Wiki里BOM里只放指引码。4. 常见问题与实战排查技巧4.1 问题速查表BOM导出失败的7种典型现象及根因现象可能根因排查步骤解决方案BOM里元件数量比原理图少分组逻辑错误或过滤条件过严在Report里取消所有Filter看是否显示全量检查OutJob的Grouping Options是否勾选了“Hide identical components”关闭隐藏相同元件选项或调整分组字段“Part Number”列全为空原理图未填写Part Number属性在原理图里随机选3个元件检查Properties面板是否有“Part Number”字段及内容批量编辑Tools → Annotation → Update Designators再手动填Part NumberExcel打开后中文乱码文件编码非UTF-8用记事本打开导出的CSV另存为UTF-8编码在OutJob的Export Settings里将“File Format”设为“Excel (.xlsx)”避免用CSV封装字段显示“ ”元件未分配封装或封装库路径错误在PCB里运行Design → Load Nets看是否有Unmatched Classes提示重新关联封装右键元件 → Properties → Footprint选择正确封装BOM里出现重复元件如R1出现两次原理图有重复Reference或未同步变更运行Tools → Annotation → Reset All Designators再重新编号删除所有Reference用Annotate工具重新生成唯一编号“Description”列内容与预期不符Description映射了错误属性在OutJob Column Configuration里查看Description对应的Expression改为直接引用“Comment”字段或自定义Expression拼接导出文件路径错误或无权限OutJob路径为相对路径或权限不足检查OutJob文件里Output Path的设置用Windows资源管理器验证路径可写改为绝对路径如“D:\Projects\BOM\”并赋予用户写入权限4.2 实战经验那些Altium手册里不会写的细节“Comment”字段的双重角色在Altium里“Comment”既是BOM里的“类别”如R/C/U也是PCB上的丝印内容。但产线要求BOM里“Comment”显示“电阻”而PCB丝印要显示“R1”。解决方案是在原理图Properties里把“Comment”设为“电阻”再在PCB里用“Designator”覆盖丝印——这样BOM和PCB各取所需。自定义字段的全局生效想让所有新元件自动带“Supplier_PN”字段不是在每个元件里手动加而是修改“Default Component Template”。在Preferences → Data Management → Default Component Template里添加“Supplier_PN”字段以后新建的元件都会自带这个属性。OutJob的静默模式批量导出时不想弹窗确认可以在OutJob文件里右键任务 → “Run in Silent Mode”。这样用命令行调用Altium时如“AltiumDesigner.exe -RunJob MyJob.OutJob”能全自动执行适合CI/CD集成。Report的缓存陷阱Report有时会显示旧数据不是软件Bug是Altium的缓存机制。强制刷新方法关闭Report窗口 → Tools → Reset System Cache → 重启Altium。比重启软件更快。BOM版本控制OutJob文件本身要纳入Git管理。但注意OutJob里包含绝对路径提交前需用文本编辑器把路径替换成占位符如“[PROJECT_ROOT]\BOM”部署时再替换为真实路径。4.3 网络热词深度解析针对“develop26.6.0 sch元器件属性properties只显示simulation generi”的真相这个现象在Altium Designer 26.6.0版本很常见根本原因不是软件缺陷而是属性视图的上下文过滤器被意外激活。当你在原理图里选中一个元件右键Properties面板默认只显示当前元件类型相关的属性集。比如选中电阻只显示“Generic”属性选中运放只显示“Simulation”属性。要看到全部字段必须点击Properties面板右上角的“Show All Fields”按钮图标是三个点的菜单。这个按钮在26.6.0里位置很隐蔽藏在面板标题栏右侧不像老版本那么明显。另外如果还是看不到自定义字段检查Project → Options → Configuration Management → “Enable Custom Parameters”是否勾选。没勾的话所有手动添加的字段都不会显示。还有一个隐藏开关在Preferences → Schematic → Graphical Editing里把“Display Mode for Component Properties”设为“Advanced”才能看到完整的属性树。5. 高阶技巧用C#二次开发实现BOM自动校验虽然Altium原生功能已足够强大但产线真正需要的是“防错”而非“纠错”。我们用C#写了轻量级校验工具集成在OutJob流程里。核心逻辑是导出BOM后自动扫描Excel检查三类问题必填字段缺失遍历“Part Number”“Manufacturer”“Footprint”列标红空单元格料号格式校验用正则匹配“RC\d{4}[A-Z]{2}-\d{2}\d{3}[A-Z]{2}”村田电阻格式不匹配的标黄数量异常对比“Quantity”和原理图里该元件的实际放置数量通过Altium API读取不一致的标红。工具用Altium的COM接口实现关键代码片段// 连接Altium实例 Application app Marshal.GetActiveObject(AltiumDesigner.Application) as Application; // 获取当前项目 Project proj app.Projects.Item(0); // 遍历所有原理图文档 foreach (Document doc in proj.Documents) { if (doc.DocumentKind SCH) { // 读取元件属性 foreach (Component comp in doc.Components) { string partNum comp.Parameters[Part Number].Value; if (string.IsNullOrEmpty(partNum)) LogError($元件 {comp.Designator} 缺少Part Number); } } }这个工具不替代Altium而是作为OutJob的“守门员”。每次点击“Generate Outputs”先运行校验通过才导出BOM。上线后BOM返工率下降73%。如果你熟悉C#这套逻辑可以直接复用如果不熟用Python的openpyxl库也能实现类似功能重点是建立“导出即校验”的习惯。6. 最后分享一个压箱底技巧BOM与PCB的双向追溯BOM和PCB之间常有信息断层。比如采购买了料但PCB上某个电容位置错了怎么快速定位我们的方案是在原理图里给每个元件加一个“PCB_Location”字段内容填“U12-A3”表示U12芯片的A3引脚附近。导出BOM时把这个字段映射进去。同时在PCB里用“Place Comment”功能在每个元件旁边放一个文本框内容绑定到“PCB_Location”属性。这样BOM里看到“U12-A3”拿PCB文件放大一看那个位置果然有个电容。这个技巧让FA失效分析时间缩短了一半。记住Altium里所有属性都是双向联动的关键是你敢不敢用。