EP036 Table.ColumnNames:动态提取表头列名清单(表头校验/动态重排/异常列溯源)

文 / 老汪(汽车零部件财务与商业智能实战派)

“老汪,我们车间质检台账里有 6 道检验工序(光谱、CNC、探伤、动平衡、粗糙度、耐压)。每天几百个批次,如果某个批次出现异常,怎样才能自动抓出到底是在‘哪几列’发生了超差,把具体的工序名字提取出来拼成一句话?”
在汽车零部件制造现场,质量分析(QA)与成本会计常常需要协同作战。如果只知道某一行有不合格,却不能自动动态输出具体是哪个项目超标,追溯责任和核算返工废品损失就会耗费大量人工比对时间。今天老汪就带大家拆解一个看似朴实无华、实则内藏乾坤的元数据级神级函数 —— Table.ColumnNames!


一、 为什么老汪说“Table.ColumnNames 是元数据级清洗的关键钥匙”?

在前面的课程中,我们学会了 Record.ToList(提取单行记录的所有值)和 List.PositionOf(查找下标位置)。

但是,如果我们想获取一张表格的“所有列标题名(Field Headers)”本身,该用什么函数?

答案就是 Table.ColumnNames。

1. 函数基本语法拆解

Table.ColumnNames(table as table) as list
  • 参数(table):目标数据表;
  • 返回值(list):由该表全部列名组成的纯文本字符串列表,例如 {"检验批次号", "核心零部件名称", "材料光谱分析", ...}。

2. 它的三大实战威力(老汪敲黑板)

  1. 表头智能防呆校验(防漏列): – 自动检测各分厂上传的 Excel 模板是否缺斤少两: powerquery List.ContainsAll(Table.ColumnNames(源), {"批次号", "零件名", "客户"})
  2. 动态列重排与安全提取(防插列): – 配合 Table.SelectColumns 或 Table.ReorderColumns,直接传给它动态列表,再也不用在代码里写死固定的列名字串!
  3. 反射定位:将数据值动态反查为列名(神级组合拳!): – 当单行中某几列满足特定条件(如不合格、发生费用)时,反向查出对应的列标题名字,完成智能归因分析!

二、 走进车间:汽车零部件底盘安全件质量检测现场

拿老汪经手的一家知名汽车底盘与动力总成制造企业(Tier 1)为例。厂里生产比亚迪海豹、特斯拉Model Y、极氪001等明星车型的铝合金控制臂、制动卡钳和副车架。

质检车间导出的《工序质检明细台账》如下(包含 9 列大宽表,文末可免费下载配套 Excel 随堂课件):

检验批次号 核心零部件名称 主机厂客户 材料光谱分析 CNC加工尺寸 X光探伤气孔 动平衡同心度 表面粗糙度 气密水压耐压
QC-202611-01 铝合金底盘下控制臂 比亚迪海豹 合格 合格 合格 合格 合格 合格
QC-202611-02 双活塞制动卡钳体 蔚来ES6总成 合格 合格 气孔超标 合格 粗糙度超差 合格
QC-202611-03 轻量化通风制动盘 特斯拉Model Y 合格 合格 合格 超差偏心 合格 合格
QC-202611-04 电池包下壳体铝托盘 吉利极氪001 合格 合格 合格 合格 合格 微漏泄压
QC-202611-05 前悬架高强副车架 理想L7底盘 材质杂质超标 合格 气孔超标 合格 合格 合格
QC-202611-06 驱动电机前置端盖 小鹏G6三电 合格 尺寸超差 合格 合格 合格 合格
QC-202611-07 后悬架双球节摆臂 小米SU7总成 合格 合格 合格 合格 合格 合格
QC-202611-08 高精度转向节臂管 广汽埃安Hyper 合格 尺寸超差 合格 超差偏心 粗糙度超差 合格

📱 移动端排版体验:上方表格已配置横向平滑滚动容器,在手机端手指左右滑动即可舒展查看完整 9 列数据,单元格字距舒展绝不挤爆!

大家仔细观察:每个批次发生异常的列都不一样,有的批次(02批次)在“X光探伤气孔”和“表面粗糙度”两处出问题,有的批次(08批次)多达三项超标。我们必须动态把这些列名提取出来!


三、 白话拆解:四大函数神级联动五步法

很多财务同学觉得 M 语言深奥,老汪用一张图给你讲清楚这套组合拳的流转逻辑:

[当前行记录] ──Record.ToList──> {合格, 气孔超标, 粗糙度超差...}
                                       │
                                (抓出非合格下标)
                                       ↓
                                   { 1, 3 } 
                                       │
   Table.ColumnNames(源) ──────────→ (动态取名) ──> {"X光探伤气孔", "表面粗糙度"}
                                                           │
                                                      Text.Combine
                                                           ↓
                                              "X光探伤气孔、表面粗糙度"
  1. 第一步(取表头):用 Table.ColumnNames(源) 提取所有列名,并用 List.Skip(..., 3) 得到 6 个纯质检项目列名列表;
  2. 第二步(行转值):用 Record.SelectFields 和 Record.ToList 提取当前行的 6 个检测值列表;
  3. 第三步(抓下标):用 List.Select(List.Positions(值列表), (i) => 值列表{i} <> "合格") 找出所有异常项目的数字下标;
  4. 第四步(反查名):用 List.Transform(下标列表, each 质检项目列清单{_}) 动态反射拿到对应的中文列标题名;
  5. 第五步(拼文本):用 Text.Combine 用顿号连接成通顺的业务说明!

四、 高级编辑器手把手实操代码

在随堂 Excel 课件中,老汪已将 Q001 动态相对路径标准置入【配置】表。进入 Power Query 高级编辑器,贴入老汪的标准自适应代码:

let
    // 💡 老汪敲黑板(免改路径直接刷新秘籍):换电脑解压后直接点【全部刷新】永不报红字!
    当前路径 = try 
        let 
            raw = Text.From(Excel.CurrentWorkbook(){[Name="当前路径"]}[Content]{0}[Column1]),
            clean = Text.Trim(raw)
        in 
            if Text.EndsWith(clean, "\") then clean else clean & "\"
    otherwise 
        "./",

    // 1. 读取原始业务数据源
    数据源路径 = 当前路径 & "原始业务数据表.xlsx",
    源 = Excel.Workbook(File.Contents(数据源路径), null, true),
    质检原始表 = 源{[Item="工序质检明细台账", Kind="Sheet"]}[Data],
    提升标题 = Table.PromoteHeaders(质检原始表, [PromoteAllScalars=true]),
    更改类型 = Table.TransformColumnTypes(提升标题, {
        {"检验批次号", type text},
        {"核心零部件名称", type text},
        {"主机厂客户", type text},
        {"材料光谱分析", type text},
        {"CNC加工尺寸", type text},
        {"X光探伤气孔", type text},
        {"动平衡同心度", type text},
        {"表面粗糙度", type text},
        {"气密水压耐压", type text}
    }),

    // 2. 核心大招:动态提取表头列名并剥离出纯质检科目
    全表列名清单 = Table.ColumnNames(更改类型),
    质检项目列清单 = List.Skip(全表列名清单, 3),

    // 3. 神级组合拳:逐行找出异常列名并拼装
    添加异常列名清单 = Table.AddColumn(更改类型, "异常缺陷工序名称清单", each 
        let 
            当前行质检记录 = Record.SelectFields(_, 质检项目列清单),
            当前行质检列表 = Record.ToList(当前行质检记录),
            // 抓出所有不等于“合格”的列下标
            异常下标列表 = List.Select(List.Positions(当前行质检列表), (idx) => 当前行质检列表{idx} <> "合格"),
            // 动态反射回对应列名
            异常列名列表 = List.Transform(异常下标列表, each 质检项目列清单{_}),
            // 拼接成通畅文本
            输出文本 = if List.IsEmpty(异常列名列表) then "无" else Text.Combine(异常列名列表, "、")
        in 
            输出文本, type text),

    // 4. 统计缺陷项目数量并给出质量处置对策
    添加缺陷项数 = Table.AddColumn(添加异常列名清单, "缺陷项目总数(项)", each 
        if [异常缺陷工序名称清单] = "无" then 0 
        else List.Count(Text.Split([异常缺陷工序名称清单], "、")), Int64.Type),

    添加综合判定 = Table.AddColumn(添加缺陷项数, "质检综合判定", each 
        if [#"缺陷项目总数(项)"] = 0 then "✅ 全检合格"
        else if [#"缺陷项目总数(项)"] = 1 then "⚠️ 单项超差待返工"
        else "🚨 多重缺陷报废预警", type text),

    添加处置对策 = Table.AddColumn(添加综合判定, "质量处置对策", each 
        if [#"缺陷项目总数(项)"] = 0 then "准予出厂放行,直接入库"
        else if [#"缺陷项目总数(项)"] = 1 then "开具《单项返工单》,派发至责任工段"
        else "启动质量仲裁复核,核算产线废品损失", type text),

    // 整理最终呈现报表
    整理输出字段 = Table.SelectColumns(添加处置对策, {
        "检验批次号", "核心零部件名称", "主机厂客户", 
        "质检综合判定", "异常缺陷工序名称清单", "缺陷项目总数(项)", "质量处置对策"
    })
in
    整理输出字段

五、 最终清洗效果与车间管理看板

运行上述 M 脚本后,我们在 Excel 中得到的标准化分析看板如下(支持移动端自由横向滑动):

检验批次号 核心零部件名称 主机厂客户 质检综合判定 异常缺陷工序名称清单 缺陷项目总数(项) 质量处置对策
QC-202611-01 铝合金底盘下控制臂 比亚迪海豹 ✅ 全检合格 无 0 准予出厂放行,直接入库
QC-202611-02 双活塞制动卡钳体 蔚来ES6总成 🚨 多重缺陷报废预警 X光探伤气孔、表面粗糙度 2 启动质量仲裁复核,核算产线废品损失
QC-202611-03 轻量化通风制动盘 特斯拉Model Y ⚠️ 单项超差待返工 动平衡同心度 1 开具《单项返工单》,派发至责任工段
QC-202611-04 电池包下壳体铝托盘 吉利极氪001 ⚠️ 单项超差待返工 气密水压耐压 1 开具《单项返工单》,派发至责任工段
QC-202611-05 前悬架高强副车架 理想L7底盘 🚨 多重缺陷报废预警 材料光谱分析、X光探伤气孔 2 启动质量仲裁复核,核算产线废品损失
QC-202611-06 驱动电机前置端盖 小鹏G6三电 ⚠️ 单项超差待返工 CNC加工尺寸 1 开具《单项返工单》,派发至责任工段
QC-202611-07 后悬架双球节摆臂 小米SU7总成 ✅ 全检合格 无 0 准予出厂放行,直接入库
QC-202611-08 高精度转向节臂管 广汽埃安Hyper 🚨 多重缺陷报废预警 CNC加工尺寸、动平衡同心度、表面粗糙度 3 启动质量仲裁复核,核算产线废品损失

看!不需要人工逐个眼睛盯,每一批次究竟在哪些工序出问题、缺陷项目有几个,清清楚楚全部动态抓取出来,质量部和财务成本会计一眼就能定责定损!


六、 老汪从业多年总结的 2 个避坑指南

  1. 别用静态字符串硬编码列名: – 很多同学图省事,在代码里写死 {"材料光谱", "CNC加工"...},结果下个月车间新增了“超声波探伤”列,整个自动化模型就漏掉了新列! – 善用 Table.ColumnNames 动态提取,以后不管车间增加 3 道还是 10 道质检工序,代码一行都不用动!
  2. 处理表头前后空格的防崩小招: – 车间文员手工输入的列名常带隐蔽空格(如 "CNC加工尺寸 "),导致后续匹配失误。老汪教大家一个小妙招:在提取出列名后,用 List.Transform(Table.ColumnNames(源), Text.Trim) 顺手把所有列名修剪干净,这是工业级 ETL 的看家本领!

大家赶紧在文末免费下载随堂实操课件包,打开 PQ 高级编辑器跟老汪同步动手操练起来!

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容