ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1407|回复: 25

[求助] 请教:将表格中送货单l的数据提取出来,做成送货单明细里面的格式,用POWER QUERY...

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-23 10:47 | 显示全部楼层 |阅读模式
如标题,请教如何实现,谢谢!

送货单R-TEST.rar

507.79 KB, 下载次数: 43

TA的精华主题

TA的得分主题

发表于 2023-3-23 11:46 | 显示全部楼层
很遗憾,Power Query做不了这种工作。

TA的精华主题

TA的得分主题

发表于 2023-3-25 02:02 | 显示全部楼层
试着做了下,过程中发现部分表单格式不一,比如NO:  00009.这部分数据暂无法处理.
  1. let
  2.     Source = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
  3.     #"Replaced Value" = Table.ReplaceValue(Source," ","",Replacer.ReplaceText,{"列4"}),
  4.     #"Added Conditional Column" = Table.AddColumn(#"Replaced Value", "自定义", each if Text.Contains([列4], "送货单") then [列8] else null),
  5.     #"Changed Type1" = Table.TransformColumnTypes(#"Added Conditional Column",{{"列1", type text}}),
  6.     #"Replaced Value1" = Table.ReplaceValue(#"Changed Type1"," ","",Replacer.ReplaceText,{"列1"}),
  7.     #"Added Conditional Column1" = Table.AddColumn(#"Replaced Value1", "自定义.1", each if Text.Contains([列1], "客户") then [列8] else null),
  8.     #"Added Conditional Column2" = Table.AddColumn(#"Added Conditional Column1", "自定义.2", each if Text.StartsWith([列1], "客户:") then [列1] else null),
  9.     #"Replaced Errors" = Table.ReplaceErrorValues(#"Added Conditional Column2", {{"自定义.1", null}}),
  10.     #"Replaced Errors1" = Table.ReplaceErrorValues(#"Replaced Errors", {{"自定义.2", null}}),
  11.     #"Replaced Errors2" = Table.ReplaceErrorValues(#"Replaced Errors1", {{"自定义", null}}),
  12.     #"Filled Down" = Table.FillDown(#"Replaced Errors2",{"自定义", "自定义.1", "自定义.2"}),
  13.     #"Removed Top Rows" = Table.Skip(#"Filled Down",5),
  14.     #"Split Column by Character Transition" = Table.SplitColumn(#"Removed Top Rows", "自定义", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"自定义.1.1", "自定义.2.1"}),
  15.     #"Split Column by Position" = Table.SplitColumn(#"Split Column by Character Transition", "自定义.2", Splitter.SplitTextByPositions({0, 3}, false), {"自定义.2.1.1", "自定义.2.2"}),
  16.     #"Removed Columns" = Table.RemoveColumns(#"Split Column by Position",{"自定义.1.1", "自定义.2.1.1"}),
  17.     #"Promoted Headers" = Table.PromoteHeaders(#"Removed Columns", [PromoteAllScalars=true]),
  18.     #"Filtered Rows" = Table.SelectRows(#"Promoted Headers", each ([单位] <> null and [单位] <> "单位")),
  19.     #"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows",{{"订单号码", type text}})
  20. in
  21.     #"Changed Type"
复制代码

送货单R-TEST.zip

543.42 KB, 下载次数: 15

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-25 09:11 | 显示全部楼层
弱水三瓢 发表于 2023-3-25 02:02
试着做了下,过程中发现部分表单格式不一,比如NO:  00009.这部分数据暂无法处理.

谢谢!我把00009这个送货单的格式调整了一下就可以了!另外请问,客户,日期,送货单的索引在PQ里面是怎样完成数据清洗实现的?可以给个详细的步骤吗?谢谢!

TA的精华主题

TA的得分主题

发表于 2023-3-25 10:51 | 显示全部楼层
本帖最后由 弱水三瓢 于 2023-3-25 10:53 编辑
hopewell 发表于 2023-3-25 09:11
谢谢!我把00009这个送货单的格式调整了一下就可以了!另外请问,客户,日期,送货单的索引在PQ里面是怎 ...

一般这种类型的原始表我自己有两种处理办法,一是每组表的行数一样格式一样的情况下,运用取模取余的方式处理,二是行数不一样的情况下,考虑添加条件列的方式,将这些不在主表内的字段值添加到新列里,然后把这些新列向下填充,这样每组表就获得了这些字段属性相应的值。    具体到你这个表,处理的时候发现每组并不是一样的行数,就用了第二种方法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-25 10:55 | 显示全部楼层
弱水三瓢 发表于 2023-3-25 10:51
一般这种类型的原始表我自己有两种处理办法,一是每组表的行数一样格式一样的情况下,运用取模取余的方式 ...

请教一下:行数不一样的情况下,考虑添加条件列的方式,将这些不在主表内的字段值添加到新列里,这个具体要怎样操作,自己弄了半天没做出来,可以给我一个步骤吗?谢谢!

TA的精华主题

TA的得分主题

发表于 2023-3-25 18:15 | 显示全部楼层
hopewell 发表于 2023-3-25 10:55
请教一下:行数不一样的情况下,考虑添加条件列的方式,将这些不在主表内的字段值添加到新列里,这个具体 ...

以单号为例,因为只有列8单号与列4“送货单”在同一行里,这样就新建条件列,当列4值=“送货单”时,新列当前行取列8当前行值,即单号。这样每组送货单都会在新列中取到一个各自的单号。然后对该列向下填充,这样每组送货单的每行都会得到对应的送货单号。

这类问题算是有套路的,有了思路后就是基本的点点鼠标,也不用自己写M语句,过程中碰到问题就想法解决问题。基本的菜单功能操作要熟悉。可以读读Master your data 这本经典的pq书,跟着案例操作下,相信你会有大有收获。

TA的精华主题

TA的得分主题

发表于 2023-4-4 16:26 | 显示全部楼层

  1. let
  2.     源 = Excel.CurrentWorkbook(){[Name="表3"]}[Content],
  3.     分组的行 = Table.Group(源, {"列7"}, {"计数", each _},0,(x,y)=>try if Text.Contains( y[列7],"NO: ") then 1 else 0 otherwise 0),
  4.     筛选的行 = Table.SelectRows(分组的行, each ([列7] <> null)),
  5.     已添加自定义1 = Table.AddColumn(筛选的行, "自定义", (x) =>
  6.                     let
  7.                         单号= x[计数][列7]{0},
  8.                         日期= x[计数][列7]{2},
  9.                         客户= List.Skip( Text.SplitAny(x[计数][列1]{2},":")){0},
  10.                         计数2=Table.AddColumn(x[计数],"单号",each 单号),
  11.                         计数3=Table.AddColumn(计数2,"日期",each 日期),
  12.                         计数4=Table.AddColumn(计数3,"客户",each 客户),
  13.                         删除的列 = Table.RemoveColumns(计数4,{"列9", "列10"}),
  14.                         重命名的列 = Table.RenameColumns(删除的列,{{"列1", "订单号码"}, {"列2", "品名及规格"}, {"列3", "颜色"}, {"列4", "单位"}, {"列5", "数量"}, {"列6", "件数"}, {"列7", "净重(kg)"}, {"列8", "备注"}}),
  15.                         自定义1 = Table.Skip( 重命名的列,3),
  16.                         筛选的行1 = Table.SelectRows(自定义1, each ([数量] <> null))
  17.                 in
  18.                         筛选的行1                  
  19.                     ),
  20.     删除的其他列 = Table.SelectColumns(已添加自定义1,{"自定义"}),
  21.     #"展开的“自定义”" = Table.ExpandTableColumn(删除的其他列, "自定义", {"订单号码", "品名及规格", "颜色", "单位", "数量", "件数", "净重(kg)", "备注", "单号", "日期", "客户"}),
  22.     筛选的行1 = Table.SelectRows(#"展开的“自定义”", each ([订单号码] <> "订单号码")),
  23.     更改的类型 = Table.TransformColumnTypes(筛选的行1,{{"日期", type date}})
  24. in
  25.     更改的类型
复制代码

TA的精华主题

TA的得分主题

发表于 2023-4-4 18:41 | 显示全部楼层
let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    分组 = Table.RemoveColumns(Table.Group(源,"列10",{{"送货单号",each [列8]{2}},{"日期",each [列8]{4}},{"客户",each Text.Replace([列1]{4},"客户:","")},{"数据",each Table.PromoteHeaders(Table.RemoveColumns(Table.FirstN(Table.Skip(_,5),(x)=>x[列1]<>null),"列10"))}},0,(x,y)=>Number.From(y<>null)),"列10"),
    展开 = Table.ExpandTableColumn(分组,"数据",Table.ColumnNames(分组[数据]{0}))
in
    展开
image.jpg

TA的精华主题

TA的得分主题

发表于 2023-4-5 18:39 | 显示全部楼层
hbzql 发表于 2023-4-4 18:41
let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    分组 = Table.RemoveColumns(Table. ...

请问一下大神:比如0002号送货单,净重和备注有合并单元格,怎么处理呢?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-30 16:50 , Processed in 0.046914 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表