鱼C论坛

 找回密码
 立即注册
查看: 1946|回复: 3

python递归相关问题,求助大神帮完善下代码!!!

[复制链接]
发表于 2022-5-29 16:31:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
希望 通过生产计划表和物料清单,自动生成物料需求计划表。
  1. import pandas as pd
  2. import xlwings as xw

  3. file = r"C:\Users\郝\Desktop\ERP.xlsm"
  4. # 导入xlwings模块,打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
  5. wb = xw.Book(file)
  6. wb.app.display_alerts = False
  7. # 文件位置:filepath,打开test文档,然后保存,关闭,结束程序

  8. sht_test = wb.sheets['base']
  9. sht_view = wb.sheets['view']

  10. RNG1 = sht_test[19, 0].api.currentregion
  11. RNG2 = sht_test[19, 5].api.currentregion
  12. # 命名Excel单元格区域名称
  13. RNG1.name = 'Bom'
  14. RNG2.name = 'Plan'

  15. '''
  16. Plan及Bom资料导入pandas的DataFrame中
  17. header=1表示单元格区第一行为列标题行
  18. index=True表示单元格区第一列为索引列,False表示自动索引(从0开始)
  19. '''

  20. dfsz5 = sht_test['Plan'].options(pd.DataFrame, header=1, index=True).value
  21. dfsz6 = sht_test['Bom'].options(pd.DataFrame, header=1, index=True).value

  22. '''
  23. 连接Plan和Bom,merge横向(列)连接,类似SQL SERVER数据库连接join,
  24. left_index=True,right_index=True表示左右两个DataFrame以索引列为基准进行连接
  25. how='inner'表示内连接
  26. Bom(bill of material)根据物料清单(递归)计算 MRP 物料需求计划
  27. 第二阶开始到最尾阶的物料分解,从第一阶分解后取得所需数据
  28. '''


  29. def eeBom(df4A,df4,df2,CX1):
  30.     df5=df4[['CID','PCQT','PROCID']]
  31.     df5.rename(columns={'CID': 'PID','PCQT': 'PQT','PROCID': 'PROPID'}, inplace=True)
  32.     df5.reset_index(drop=True, inplace=True)
  33.     df5.set_index('PID', inplace=True)
  34.     df6=pd.merge(df5, df2, left_index=True,right_index=True, how='inner')
  35.     if df6.empty:
  36.         return df4A
  37.     else:
  38.         df6['PCQT'] = df6['PQT']*df6['CQT']
  39.         df6['PROCID'] = df6['PROPID']+'-'+str(CX1+1)
  40.         df6['LEVEL'] = CX1+1
  41.         df4A=df4A.append(df6)
  42.         return eeBom(df4A, df6, df2, CX1+1)
  43. # 第一阶的物料分解,从Plan取得所需数据
  44. # 首先调动eBom函数,eBom函数再调用eeBom,但是eeBom要定义在eBom之前,不然会出错,会显示找不到eeBom函数


  45. def eBom(df1,df2):
  46.     df3=pd.merge(df1, df2, left_index=True, right_index=True, how='inner')
  47.     df3['PCQT'] = df3['PQT']*df3['CQT']
  48.     df3['PROCID'] = df3['PROPID']+'-'+str(1)
  49.     df3['LEVEL'] = 1
  50.     return eeBom(df3, df3, df2, 1)
  51. # 计算MRP,并按单据号,物料父项编号排序


  52. dfsz7 = eBom(dfsz5, dfsz6).sort_values(by = ['PROCID', 'PID'])
  53. # 'FC'列标志物料子项是否为:'F'-尾阶(最终件),'M'-非尾阶(中间件)
  54. # 全部先标注为'M'
  55. dfsz7['FC']='M'
  56. #获取Bom表中所有物料父项编号,取唯一值即可
  57. list1=list(dfsz6.index.unique())
  58. # print(list1)
  59. # 对MRP物料需求计划表中的最终件标识为'F'
  60. dfsz7.loc[~dfsz7['CID'].isin( list1),['FC']]='F'
  61. # 就这样完成啦!超简洁,有没有小伙伴们!
  62. print(dfsz7)
  63. # 导出到Excel,首先删除A:AA列,把格式也一起删除,用cells.delete或clear无法删除格式
  64. '''
  65. sht_view.api.columns('A:AA').delete
  66. sht_view.api.cells.delete
  67. sht_view.clear
  68. '''
  69. # 在Excel view表'A1'单元格的扩展位置显示dfsz5(即:Plan生产计划表)
  70. sht_view.range(1,1).expand().value = dfsz5
  71. # 在Excel view表'E1'单元格的扩展位置显示dfsz6(即:Bom物料清单表)
  72. sht_view.range(1,5).expand().value = dfsz6
  73. # 在Excel view表'I1'单元格的扩展位置显示dfsz7(即:MRP物料需求计划表)
  74. sht_view.range(1,9).expand().value = dfsz7
  75. # 在Excel view表'第4、8列设置列的颜色,便于在Excel中区分各个计算出来的数据集
  76. sht_view.cells.columns(4).color=(255,128,255)
  77. sht_view.cells.columns(8).color=(255,128,255)
  78. # 列自动调整宽度,如果要指定列宽可用 sht_view.range((1,1),(1,20)).api.ColumnWidth = 8
  79. # sht_view.api.columns('A:AA').autofit
复制代码

生产计划表

生产计划表

物料清单表

物料清单表

物料需求计划表

物料需求计划表
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-29 16:35:37 | 显示全部楼层
  实现的结果希望是和view表一样!!
原表.png
结果表.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-29 16:36:57 | 显示全部楼层
目前代码 未知错误,求助大神帮忙看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-29 16:51:18 | 显示全部楼层
表格文件和源码

表格及代码.rar

10.27 KB, 下载次数: 4

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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