自动化办公--通过BOM表输出原材料状态(第一版)
生活随笔
收集整理的這篇文章主要介紹了
自动化办公--通过BOM表输出原材料状态(第一版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
提示:通過文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、現有的數據有哪些?
- 二、使用步驟
- 1.引入庫
- 2.讀入數據
- 總結
前言
通過已有的產品BOM狀態,運用python自動整理匯總輸出零部件狀態至Excel中。
運算邏輯:先通過母件編碼狀態——確認出料體狀態——再通過料體狀態確認出原料狀態。
? ? ? ?確認料體狀態時,會存在著同一種同時存在4種狀態,原因是一種料體會組裝成不同的產品銷售。當一種料體存在著1~4種時,需要按照優先順序選取,分別為正常銷售>消耗升級>消耗淘汰>已下架。同理,原材料也會存在相同的問題,篩選方法一樣。
提示:以下是本篇文章正文內容,下面案例可供參考
一、現有的數據有哪些?
1,BOM表,格式如下:
其中子件編碼分為三個等級,分別為半成品,料體,原材料,而我們要輸出的時最后一級,原材料的狀態
| 母件編碼 | 母件名稱 | 母件規格 | 子件編碼 | 子件名稱 | 子件規格 | 子件計量單位 | 使用數量 | 母件存貨分類 | 子件存貨分類 |
2,產品狀態表
二、使用步驟
1.引入庫
代碼如下(示例):
import pandas as pd from pandas import DataFrame from openpyxl import load_workbook,Workbook #篩選母件編碼為1開頭的BOM明細 wb=load_workbook('BOM表test.xlsx') ws=wb.active # 新建工作簿 new_wb = Workbook() # 獲取新工作簿中的工作表 new_ws = new_wb.active # 獲取表頭 late_header = [] for cell in ws[1]:late_header.append(cell.value) # 將表頭寫入新工作簿的工作表中 new_ws.append(late_header) for row in ws.iter_rows(min_row=2, values_only=True):name = row[0] #指定欄存貨編碼if name.startswith('1'): #篩選存貨編碼1開頭的成品明細new_ws.append(row)#print(row)#篩選存貨編碼3開頭的料體明細 new_ws1=new_wb.create_sheet('配方明細') # 獲取表頭 late_header = [] for cell in ws[1]:late_header.append(cell.value) # 將表頭寫入新工作簿的工作表中 new_ws1.append(late_header)for row in ws.iter_rows(min_row=2, values_only=True):name = row[0] #指定欄存貨編碼if name.startswith('3'): #篩選存貨編碼3開頭的明細,如果用母件分類為料體篩選會遺漏new_ws1.append(row)new_wb.save('管理狀態表test.xlsx')#導入數據 data1=pd.read_excel('成品狀態表1022.xlsx') df1=DataFrame(data1) #創建DataFrame對象數據data=pd.read_excel('管理狀態表test.xlsx') df=DataFrame(data) #創建DataFrame對象數據 df1=df1.loc[:, ['存貨編碼', '版本狀態']] #切片,只取存貨編碼,版本狀態兩列 df=pd.merge(df,df1,on='存貨編碼',how='left') #目的:左連接匹配版本狀態至BOM表#篩選-確認料體狀態(優先級:正常銷售>消耗升級>消耗淘汰>已下架) data2=((df[df['子件存貨分類']=='料體'][['子件編碼', '子件存貨分類','版本狀態']]).drop_duplicates()).sort_values(axis=0,by='版本狀態',ascending=True) #查看條件為料體的子件編碼和存貨分類,并去重 data3=data2.rename(columns={'子件編碼':'存貨編碼'}).reset_index() #修改列名,重置索引 data3['版本狀態']=data3['版本狀態'].fillna('無狀態') #填充空值# 遍歷選出當存在多個同樣的編碼時,標記第一個出現的為“選擇”,其余標記為“不選擇” data3['遍歷']=None for i in range(0,len(data3['存貨編碼'])):if data3.iat[i,1] != data3.iat[i-1,1]: #當當前欄不等于上一行編碼時data3.iat[i,4] ='選擇'#print('選擇')else:data3.iat[i,4] ='不選擇'#print('不選擇')#篩選最終需要的料體狀態明細 data3_final=data3[data3['遍歷']=='選擇'][['存貨編碼', '版本狀態']]#將配方狀態匹配到“配方明細”表 data5=pd.read_excel('管理狀態表test.xlsx',sheet_name='配方明細') df2=DataFrame(data5) #創建DataFrame對象數據 df2['存貨編碼']=df2['存貨編碼'].astype(str) df3=pd.merge(df2,data3_final,on='存貨編碼',how='left')#從配方明細表中篩選-確認原料狀態(優先級:正常銷售>消耗升級>消耗淘汰>已下架) df4=((df3[df3['子件存貨分類']=='原料'][['子件編碼', '子件存貨分類','版本狀態']]).drop_duplicates()).sort_values(axis=0,by='子件編碼',ascending=True) #查看條件為原料的子件編碼和存貨分類,并去重 df4['版本狀態']=df4['版本狀態'].fillna('已下架') #填充空值#匯總原料通用項(只匯總正常銷售,消耗升級部分) df4['是否通用']=None #df3['匯總通用項']=df3.groupby('子件編碼')['版本狀態'].count() for k in range(0,len(df4['子件編碼'])):if df4.iat[k,2]=="1正常銷售"or df4.iat[k,2]=="2消耗升級":df4.iat[k,3]=1else:df4.iat[k,3]=0 df3_1=df4.groupby('子件編碼')['是否通用'].sum()# 遍歷選出當存在多個同樣的編碼時,標記第一個出現的為“選擇”,其余標記為“不選擇” df4['遍歷']=None for j in range(0,len(df4['子件編碼'])):if df4.iat[j,0] != df4.iat[j-1,0]:df4.iat[j,4] ='選擇'#print('選擇')else:df4.iat[j,4] ='不選擇'#print('不選擇')#篩選最終需要的料體狀態明細 df3_2=df4[df4['遍歷']=='選擇'][['子件編碼', '版本狀態']] df3_final=pd.merge(df3_2,df3_1,on='子件編碼',how='left')#導出df至excel writer = pd.ExcelWriter('原料總管理表.xlsx') df.to_excel(writer,'BOM狀態') df3.to_excel(writer,'配方明細') data3_final.to_excel(writer,'料體狀態') #data3寫入表格 df3_final.to_excel(writer,'原料狀態') writer.save()最終輸出狀態為:
?
?
總結
本文目的純屬為了記錄方便以后優化,第一次寫代碼仍有很多的bug。
需優化數據:1,與研發確認料體狀態;2,簡化代碼,提高運行效率
總結
以上是生活随笔為你收集整理的自动化办公--通过BOM表输出原材料状态(第一版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 意创坊-移动富媒体平台
- 下一篇: RFC 文档(1001-1500)