前言背景
年前运用Python写的小应用,借此刻写本文的机会,再次整理总结。
我们公司电子工程师会使用Mentor工具导出一张BOM表,然后相关专员会将其手动输入到SAP系统里 ( 为何不能一键导入?)。但由于数据庞杂,专员担心手动输入可能有误,于是又将SAP里数据导出,让工程师去比对确认材料、位号和数量有无错误。
有一次看到某同事一直忙于在整理Excel、比较数据,于是我就想能否用Pandas和PyQT5去写个小工具自动比较并导出结果?
工具界面十分简单,只要选择SAP数据表和Mentor数据表后,点击保存至Excel即可。有差异的地方按照自己想要的样式呈现在Excel,如此节省工程师整理比较数据时间。
SAP表里可能会有个某个大类产品下多个型号的设备BOM数据,而Mentor 表是单一型号设备数据。SAP 表每一行都是某个位号的材料信息,而Mentor 表里每行是某个Part No信息,2张表样式(部分)如下:
SAP和Mentor数据表(部分内容)
从上图中可看出SAP和Mentor数据表里都有很多列,但我们需要比较的分别是SAP 的Material,Componet(同Mentor里的PART NO) 和Installation point(同Mentor里的REF DES),和Mentor里的PART NO,REF DES以及COUNT。
SAP Material列筛选后有4个不同的数据,50149261-003,50149261-013,50149261-023,50149261-033,它们是用于区分同类产品下的4个不同module的设备。Mentor表文件名称包含这些字段,如文件名50149261-033(SCBIP-24V)。
工具界面
小工具界面
SAP数据
我们Upload SAP BOM表时需要对Excel进行简单判断,要求其必须含有Installation point列(Mentor不含此列)。选择Mentor数据表时,要求Excel文件名称含关键字段,否则给予错误提示。
def loadSAPData(self):
file_Path, _ = QFileDialog.getOpenFileName(self, 'Open file', "C:\\", 'Excel files(*.xlsx , *.xls)')
# 如果用户不选择文件,直接取消选择,
if file_Path =='':
return
df = pd.read_excel(file_Path) #根据路径读取excel文件
columns = df.columns.values.tolist() # 获取表所有的列名
if 'Installation point' in columns: # 判断关键字在列名称列表里
self.label_sap_file.setText(file_Path.split('/')[-1]) #文件名显示在界面上
self.sap_df = df
self.materials = df['Material'].unique() #列表,存放不同型号
self.label_sap.setStyleSheet("QLabel{border-image: url(:icons/excel.png);}") #label设置图片
else:
self.showMessage() #选择的文件不含有Installation point列,则提示错误信息
def showMessage(self):
self.materials = [] #清空列表里的material
messageBox = QMessageBox()
messageBox.setWindowIcon(QIcon(':icons/error.png')) #注意为了打包后APP上能够显示图片,此处使用冒号,icons 是项目里的一个自己创建的文件夹
messageBox.setWindowTitle('Error Message')
messageBox.setText(
"This file doesn't include a column named 'Installation point'.\nWould