目的:设计一个应用GUI用于对比两个Excel文件

背景:因工作中长于数据打交道,不可避免的会进行简单繁琐数据的对比,故人生苦短我用Python!

思路

1.参数
  • 同一个excel文件两个sheet页其中一个ODS(老数据),一个DWH(新数据)

  • 生成对比文件

  • 输入主键1 输入主键2

(默认新旧文件列名一致)

2.效果
  • 生成的文件
  • 数据量一样、每个字段不一致的数据前10
  • 数据量不一样、取两边不一样的数据前10、排除不一样的数据、每个字段不一致的数据前10
3.实现
  • 循环对比组合列(主键+对比列)
  • pandas处理差异数据、处理生成的sheet的数据格式. (先生成数据,然后调整格式)

最终实现效果

  • 选择需要对比的Excel文件
  • 输入主键1、主键2
  • 点击运行

  • 运行成功界面

  • 生成的对比结果文件

配置

import pandas as pd
from openpyxl import load_workbook#选择文件路径
path=r"C:\Users\小管同学\Desktop\Migration_Data_Compari\对比文件.xls" #input("选择文件路径:")TargetPath=r"C:\Users\小管同学\Desktop\Migration_Data_Comparison_Tool\目标文件\对比结果.xlsx"DATA_ODS=pd.read_excel(r"C:\Users\小管同学\Desktop\Migration_Data_Comparison_Tool\对比文件.xls",sheet_name="ODS")
DATA_DWH=pd.read_excel(r"C:\Users\小管同学\Desktop\Migration_Data_Comparison_Tool\对比文件.xls",sheet_name="DWH")#选择主键
Primarykey="员工编号"#input("选择主键1:")
Primarykey# 员工编号

一、数据量

输出表格1–数据量


def write_to_excel_DataVolume(Data,TargetPath): # cor_df 为要保存的 dataframe writer = pd.ExcelWriter(TargetPath, engine='xlsxwriter') # 这里用Data.to_excel(writer,sheet_name='Sheet1', encoding='utf8', header=False, startcol=0, startrow=2) # 把dataframe的数据从第2行开始workbook  = writer.bookformat1 = workbook.add_format({ # 先把样式打包,然后之后赋值即可'bold': True, # 字体加粗'text_wrap': True, # 是否自动换行'valign': 'bottom',  #垂直对齐方式'align': 'center', # 水平对齐方式'fg_color': '#C5D9F1', # 单元格背景颜色'border': 1,# 边框})    writer_sheet = writer.sheets['Sheet1']# 设置宽度writer_sheet.set_column("A:I", 16)writer_sheet.set_column('C:C',30)writer_sheet.merge_range(0,0,0,2,'对比结果',format1)writer_sheet.merge_range(4,2,4,0,'数据量差异',format1)writer_sheet.write(1,0,'',format1)writer_sheet.write(1,1,'ODS',format1)writer_sheet.write(1,2,'DWH',format1)writer.save()writer.close()DataFrame_DataVolume=pd.DataFrame([[DATA_ODS.shape[0]],[DATA_DWH.shape[0]]]).T
DataFrame_DataVolume.columns =["ODS","DWH"]
DataFrame_DataVolume.index=["数据量"]
DataFrame_DataVolume
#writeFileDataVolume(DataFrame_DataVolume,TargetPath)write_to_excel_DataVolume(DataFrame_DataVolume,TargetPath)

输出表格2–数据量差异合同


if DATA_ODS.shape[0]==DATA_DWH.shape[0]:pass
else:DATA_ODS_Primarykey=pd.DataFrame(DATA_ODS[Primarykey])DATA_DWH_Primarykey=pd.DataFrame(DATA_DWH[Primarykey])df_union = pd.concat([DATA_ODS_Primarykey,DATA_DWH_Primarykey])# 实现1df_diff_ODS = df_union.append(DATA_ODS_Primarykey).drop_duplicates(subset=df_union.columns.to_list(), keep=False)df_diff_DWH = df_union.append(DATA_DWH_Primarykey).drop_duplicates(subset=df_union.columns.to_list(), keep=False)#DWH多的合同df_diff_ODS#DWH少的合同df_diff_DWHdf_diff_DWH_Data=[]df_diff_ODS_Data=[]for i in df_diff_ODS.head(10).values.tolist():for n in i:df_diff_ODS_Data.append(n)for i in df_diff_DWH.head(10).values.tolist():for n in i:df_diff_DWH_Data.append(n)while True:if len(df_diff_DWH_Data)>len(df_diff_ODS_Data):df_diff_ODS_Data.append("-")elif len(df_diff_DWH_Data)< len(df_diff_ODS_Data):df_diff_DWH_Data.append("-")elif len(df_diff_DWH_Data)== len(df_diff_ODS_Data):breakDataFrame_DataVolume_Count_result=pd.DataFrame(df_diff_DWH_Data,df_diff_ODS_Data).reset_index()DataFrame_DataVolume_Count_result.columns=['DWH多的合同','DWH少的的合同']DataFrame_DataVolume_Count_result=DataFrame_DataVolume_Count_result.reset_index()DataFrame_DataVolume_Count_result.columns=['序号','DWH多的合同','DWH少的的合同']DataFrame_DataVolume_Count_resultfrom openpyxl import load_workbookdef write_to_excel_Count_result(Data,TargetPath):df_Old = pd.DataFrame(pd.read_excel(TargetPath)) #读取原数据文件和表 writer = pd.ExcelWriter(TargetPath,engine='openpyxl')book=load_workbook(TargetPath)writer.book = bookwriter.sheets = dict((ws.title, ws) for ws in book.worksheets)df_rows = df_Old.shape[0] #获取原数据的行数Data.to_excel(writer,startrow=df_rows+1, index=False,startcol=0,header=True)#将数据写入excel中的aa表,从第一个空行开始写writer.save()#保存write_to_excel_Count_result(DataFrame_DataVolume_Count_result,TargetPath)

二、数据值

输出表格3–差异数据

def DifferenceColumnData(OriginalData,CurrentData,Primarykey):#列对比函数Comparison_Column=pd.merge(OriginalData, CurrentData, on=Primarykey)Comparison_Column.columns=[Primarykey,"ODS","DWH"] Difference_Merge=Comparison_Column[Comparison_Column["ODS"]!=Comparison_Column["DWH"]]return Difference_MergeDifference_Field_Comparison_Data=pd.DataFrame([["数据值差异","数据值差异","数据值差异"]],columns=[Primarykey,'ODS','DWH'])
Difference_Field_Comparison_Data.drop(Difference_Field_Comparison_Data.index, inplace=True)
Difference_Field_Comparison_DataM=[]
for i in DATA_ODS.columns:if i!=Primarykey:Difference_Division=pd.DataFrame([["字段:{Field_Name}".format(Field_Name=i),"ODS","DWH"]],columns=[Primarykey,'ODS','DWH'])ResultTable=DifferenceColumnData(DATA_ODS[[Primarykey,i]],DATA_DWH[[Primarykey,i]],Primarykey=Primarykey)if ResultTable.empty==False:M.append(i)ResultTable=ResultTable.head(10)Difference_Division=Difference_Division.append(ResultTable)EmptyLine=pd.DataFrame([["","",""]],columns=[Primarykey,'ODS','DWH'])Difference_Division=Difference_Division.append(EmptyLine)Difference_Field_Comparison_Data=Difference_Field_Comparison_Data.append(Difference_Division)Difference_Field_Comparison_Data

三、按格式写入

workbook = xlsxwriter.Workbook(TargetPath)# 添加不同的sheet.
worksheet1 = workbook.add_worksheet("对比结果")# header格式.
bold = workbook.add_format({'bold': 2})headersbold = workbook.add_format({'bold': 1})#headers = list(Summary.columns)# 列宽.
worksheet1.set_column('A:D', 16)
worksheet1.set_column('C:C', 20)
worksheet1.set_column('B:B', 25)
# 行高.
worksheet1.set_row(0, 18, bold)
worksheet1.write_row('A1', headers)
worksheet1.autofilter('A1:D9999')
# worksheet1.autofilter(0, 0, 10, 3)  # 和上边的作用一样,不同写法.row = 1
for row_data in (Summary.values.tolist()):worksheet1.write_row(row, 0, row_data)row += 1format1 = workbook.add_format({ # 先把样式打包,然后之后赋值即可'bold': True, # 字体加粗'text_wrap': True, # 是否自动换行'valign': 'bottom',  #垂直对齐方式'align': 'center', # 水平对齐方式'bg_color': '#C5D9F1', # 单元格背景颜色'border': 1,# 边框})  for n in ['ODS','DWH','字段','序号','数据','合同量差异','Report完整度','完成','百分比']:worksheet1.conditional_format('A1:D999', {'type':     'text','criteria': 'containing','value':    n,'format':   format1})#worksheet1.merge_range('A2:C2')
#worksheet1.merge_range('A6:C6')worksheet1.merge_range(0,0,0,2,'生成自动对比结果',format1)
worksheet1.merge_range(1,0,1,2,'数据量',format1)
worksheet1.merge_range(5,2,5,0,'完整度',format1)
worksheet1.merge_range(9,2,9,0,'合同量差异',format1)
worksheet1.merge_range(18,2,18,0,'各个字段差异TOP10',format1)workbook.close()

四、GUI

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QApplication,QInputDialog
from PyQt5.QtWidgets import QMessageBox
import pandas as pd
import xlsxwriter
from openpyxl import load_workbook
import sys class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(935, 521)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget") self.YunXingAnLiu = QtWidgets.QPushButton(self.centralwidget)self.YunXingAnLiu.setGeometry(QtCore.QRect(490, 400, 75, 23))self.YunXingAnLiu.setObjectName("YunXingAnLiu")self.TuiChuAnLiu = QtWidgets.QPushButton(self.centralwidget)self.TuiChuAnLiu.setGeometry(QtCore.QRect(330, 400, 75, 23))self.TuiChuAnLiu.setObjectName("TuiChuAnLiu")self.ZhuJian02Kuang = QtWidgets.QLineEdit(self.centralwidget)self.ZhuJian02Kuang.setGeometry(QtCore.QRect(300, 300, 311, 20))self.ZhuJian02Kuang.setObjectName("ZhuJian02Kuang")self.XuanZheAnLiu = QtWidgets.QPushButton(self.centralwidget)self.XuanZheAnLiu.setGeometry(QtCore.QRect(210, 170, 75, 23))self.XuanZheAnLiu.setObjectName("XuanZheAnLiu")self.ShuRuZhuJian01AnLiu = QtWidgets.QPushButton(self.centralwidget)self.ShuRuZhuJian01AnLiu.setGeometry(QtCore.QRect(210, 230, 75, 23))self.ShuRuZhuJian01AnLiu.setObjectName("ShuRuZhuJian01AnLiu")self.ShuRuZhuJian02AnLiu = QtWidgets.QPushButton(self.centralwidget)self.ShuRuZhuJian02AnLiu.setGeometry(QtCore.QRect(210, 300, 75, 23))self.ShuRuZhuJian02AnLiu.setObjectName("ShuRuZhuJian02AnLiu")self.XuanZheWenJianKuang = QtWidgets.QLineEdit(self.centralwidget)self.XuanZheWenJianKuang.setGeometry(QtCore.QRect(300, 170, 311, 20))self.XuanZheWenJianKuang.setObjectName("XuanZheWenJianKuang")self.ZhuJian01Kuang = QtWidgets.QLineEdit(self.centralwidget)self.ZhuJian01Kuang.setGeometry(QtCore.QRect(300, 230, 311, 20))self.ZhuJian01Kuang.setObjectName("ZhuJian01Kuang")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 935, 23))self.menubar.setObjectName("menubar")self.menu = QtWidgets.QMenu(self.menubar)self.menu.setObjectName("menu")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.actionTime = QtWidgets.QAction(MainWindow)self.actionTime.setObjectName("actionTime")self.actiontuivhu = QtWidgets.QAction(MainWindow)self.actiontuivhu.setObjectName("actiontuivhu")self.menubar.addAction(self.menu.menuAction())self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "BI Migration Tools V1.0"))self.YunXingAnLiu.setText(_translate("MainWindow", "运行"))self.TuiChuAnLiu.setText(_translate("MainWindow", "退出"))self.XuanZheAnLiu.setText(_translate("MainWindow", "选择文件"))self.ShuRuZhuJian01AnLiu.setText(_translate("MainWindow", "输入主键1"))self.ShuRuZhuJian02AnLiu.setText(_translate("MainWindow", "输入主键2"))self.menu.setTitle(_translate("MainWindow", "菜单"))self.actionTime.setText(_translate("MainWindow", "Time"))self.actiontuivhu.setText(_translate("MainWindow", "tuivhu"))

最终Code

使用GUI将配置的过程进行封装,让用户进行选择,并打包成可移植的exe文件

# -*- coding: utf-8 -*-
#
# Author: Kyle
# Creation time:April 10, 2022
# Version:V1.0from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QApplication,QInputDialog
from PyQt5.QtWidgets import QMessageBox
import pandas as pd
import xlsxwriter
from openpyxl import load_workbook
import sys class Ui_MainWindow(object):def __init__(self):self.path_file = ""self.Primarykey1=""#self.getText01()self.Primarykey2=""#self.getText01()#self.TargetPath="C:\\Users\\小管同学\\Desktop\\Migration_Data_Comparison_Tool\\对比结果.xlsx"self.TargetPath="./对比结果.xlsx"def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(935, 521)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget") self.YunXingAnLiu = QtWidgets.QPushButton(self.centralwidget)self.YunXingAnLiu.setGeometry(QtCore.QRect(490, 400, 75, 23))self.YunXingAnLiu.setObjectName("YunXingAnLiu")self.TuiChuAnLiu = QtWidgets.QPushButton(self.centralwidget)self.TuiChuAnLiu.setGeometry(QtCore.QRect(330, 400, 75, 23))self.TuiChuAnLiu.setObjectName("TuiChuAnLiu")self.ZhuJian02Kuang = QtWidgets.QLineEdit(self.centralwidget)self.ZhuJian02Kuang.setGeometry(QtCore.QRect(300, 300, 311, 20))self.ZhuJian02Kuang.setObjectName("ZhuJian02Kuang")self.XuanZheAnLiu = QtWidgets.QPushButton(self.centralwidget)self.XuanZheAnLiu.setGeometry(QtCore.QRect(210, 170, 75, 23))self.XuanZheAnLiu.setObjectName("XuanZheAnLiu")self.ShuRuZhuJian01AnLiu = QtWidgets.QPushButton(self.centralwidget)self.ShuRuZhuJian01AnLiu.setGeometry(QtCore.QRect(210, 230, 75, 23))self.ShuRuZhuJian01AnLiu.setObjectName("ShuRuZhuJian01AnLiu")self.ShuRuZhuJian02AnLiu = QtWidgets.QPushButton(self.centralwidget)self.ShuRuZhuJian02AnLiu.setGeometry(QtCore.QRect(210, 300, 75, 23))self.ShuRuZhuJian02AnLiu.setObjectName("ShuRuZhuJian02AnLiu")self.XuanZheWenJianKuang = QtWidgets.QLineEdit(self.centralwidget)self.XuanZheWenJianKuang.setGeometry(QtCore.QRect(300, 170, 311, 20))self.XuanZheWenJianKuang.setObjectName("XuanZheWenJianKuang")self.ZhuJian01Kuang = QtWidgets.QLineEdit(self.centralwidget)self.ZhuJian01Kuang.setGeometry(QtCore.QRect(300, 230, 311, 20))self.ZhuJian01Kuang.setObjectName("ZhuJian01Kuang")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 935, 23))self.menubar.setObjectName("menubar")self.menu = QtWidgets.QMenu(self.menubar)self.menu.setObjectName("menu")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.actionTime = QtWidgets.QAction(MainWindow)self.actionTime.setObjectName("actionTime")self.actiontuivhu = QtWidgets.QAction(MainWindow)self.actiontuivhu.setObjectName("actiontuivhu")self.menubar.addAction(self.menu.menuAction())self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)#app = QtWidgets.QApplication(sys.argv)#self.QInputDialog=QtWidgets.QInputDialog()  #生成一个自定义的QInputDialog的实例self.XuanZheAnLiu.clicked.connect(self.openTextFile)#选择文件self.TuiChuAnLiu.clicked.connect(self.quitApp)#退出#self.ShuRuZhuJian01AnLiu.clicked.connect(self.getItem)#主键1#self.ShuRuZhuJian02AnLiu.clicked.connect(self.getText)#主键1self.YunXingAnLiu.clicked.connect(self.RunAnLiu)#主键1def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "BI Migration Tools V1.0"))self.YunXingAnLiu.setText(_translate("MainWindow", "运行"))self.TuiChuAnLiu.setText(_translate("MainWindow", "退出"))self.XuanZheAnLiu.setText(_translate("MainWindow", "选择文件"))self.ShuRuZhuJian01AnLiu.setText(_translate("MainWindow", "输入主键1"))self.ShuRuZhuJian02AnLiu.setText(_translate("MainWindow", "输入主键2"))self.menu.setTitle(_translate("MainWindow", "菜单"))self.actionTime.setText(_translate("MainWindow", "Time"))self.actiontuivhu.setText(_translate("MainWindow", "tuivhu"))#打开excel获取路径def openTextFile(self): fd,fp = QFileDialog.getOpenFileName(self.centralwidget, "选择文件", "", "All Files(*)")f=open(fd,'rb')self.XuanZheWenJianKuang.setText(fd)f.close()print(fd)self.path_file=fd def getText01(self):self.Primarykey1= self.ZhuJian01Kuang.text()print(self.Primarykey1) return self.Primarykey1def getText02(self):self.Primarykey2= self.ZhuJian02Kuang.text()print(self.Primarykey2) return self.Primarykey2def getItem(self): text, ok = QInputDialog.getText(self, '文本输入框', '输入主键1')if ok and text:self.lineEdit1.setText(text)def getText(self):text, ok = QInputDialog.getText(self, '文本输入框', '输入主键2')if ok and text:self.lineEdit2.setText(text)def quitApp(self):print("退出成功!")sys.exit(0)def DifferenceColumnData(self,OriginalData,CurrentData,Primarykey):#列对比函数Comparison_Column=pd.merge(OriginalData, CurrentData, on=Primarykey)Comparison_Column.columns=[Primarykey,"ODS","DWH"] Difference_Merge=Comparison_Column[Comparison_Column["ODS"]!=Comparison_Column["DWH"]]return Difference_Mergedef retrieveData(self,TargetPath,Primarykey,DATA_ODS,DATA_DWH):DataFrame_DataVolume=pd.DataFrame([[DATA_ODS.shape[0]],[DATA_DWH.shape[0]]]).TDataFrame_DataVolume.columns =["ODS","DWH"]DataFrame_DataVolume.index=["数据量"]DataFrame_DataVolume=DataFrame_DataVolume.reset_index()DataFrame_DataVolume.columns=["序号","ODS","DWH"]DataFrame_DataVolumeif DATA_ODS.shape[0]==DATA_DWH.shape[0]:passelse:DATA_ODS_Primarykey=pd.DataFrame(DATA_ODS[Primarykey])DATA_DWH_Primarykey=pd.DataFrame(DATA_DWH[Primarykey])df_union = pd.concat([DATA_ODS_Primarykey,DATA_DWH_Primarykey])# 实现1df_diff_ODS = df_union.append(DATA_ODS_Primarykey).drop_duplicates(subset=df_union.columns.to_list(), keep=False)df_diff_DWH = df_union.append(DATA_DWH_Primarykey).drop_duplicates(subset=df_union.columns.to_list(), keep=False)#DWH多的合同df_diff_ODS#DWH少的合同df_diff_DWHdf_diff_DWH_Data=[]df_diff_ODS_Data=[]for i in df_diff_ODS.head(10).values.tolist():for n in i:df_diff_ODS_Data.append(n)for i in df_diff_DWH.head(10).values.tolist():for n in i:df_diff_DWH_Data.append(n)while True:if len(df_diff_DWH_Data)>len(df_diff_ODS_Data):df_diff_ODS_Data.append("-")elif len(df_diff_DWH_Data)< len(df_diff_ODS_Data):df_diff_DWH_Data.append("-")elif len(df_diff_DWH_Data)== len(df_diff_ODS_Data):breakDataFrame_DataVolume_Count_result=pd.DataFrame(df_diff_DWH_Data,df_diff_ODS_Data).reset_index()DataFrame_DataVolume_Count_result.columns=['DWH多的合同','DWH少的的合同']DataFrame_DataVolume_Count_result=DataFrame_DataVolume_Count_result.reset_index()DataFrame_DataVolume_Count_result.columns=['序号','DWH多的合同','DWH少的的合同']DataFrame_DataVolume_Count_resultDifference_Field_Comparison_Data=pd.DataFrame([["数据值差异","数据值差异","数据值差异"]],columns=[Primarykey,'ODS','DWH'])Difference_Field_Comparison_Data.drop(Difference_Field_Comparison_Data.index, inplace=True) Difference_Field_Comparison_DataM=[]for i in DATA_ODS.columns:if i!=Primarykey:Difference_Division=pd.DataFrame([["字段:{Field_Name}".format(Field_Name=i),"ODS","DWH"]],columns=[Primarykey,'ODS','DWH'])ResultTable=self.DifferenceColumnData(DATA_ODS[[Primarykey,i]],DATA_DWH[[Primarykey,i]],Primarykey=Primarykey)if ResultTable.empty==False:M.append(i)ResultTable=ResultTable.head(10)Difference_Division=Difference_Division.append(ResultTable)EmptyLine=pd.DataFrame([["","",""]],columns=[Primarykey,'ODS','DWH'])Difference_Division=Difference_Division.append(EmptyLine)Difference_Field_Comparison_Data=Difference_Field_Comparison_Data.append(Difference_Division)Difference_Field_Comparison_DataDataFrame_DataVolumePercentagedifference = format(round(len(M)/DATA_ODS.shape[1], 6) , '.2%') PercentageComplete=format(1-round(len(M)/DATA_ODS.shape[1], 6) , '.2%') FieldValueDifferenceHeader=pd.DataFrame([["","Report完整度",""],["序号",'已完成','未完成'],["百分比",PercentageComplete,Percentagedifference]],columns=["序号",'ODS','DWH'])FieldValueDifferenceHeader#表格2DataFrame_DataVolume_Count_result.columns=["序号",'ODS','DWH']DataFrame_DataVolume_Count_result#表格3Difference_Field_Comparison_Data.columns=["序号",'ODS','DWH']Difference_Field_Comparison_Data#空行Empty_Line_DataFrame=pd.DataFrame([[" "," ",""]],columns=["序号",'ODS','DWH'])Summary=pd.DataFrame([["","数据量",""],["序号","ODS","DWH"]],columns=["序号","ODS","DWH"])Summary=Summary.append(DataFrame_DataVolume)Summary=Summary.append(Empty_Line_DataFrame)Summary=Summary.append(FieldValueDifferenceHeader)Summary=Summary.append(Empty_Line_DataFrame)SummaryDataVolumeVarianceHeader=pd.DataFrame([["","合同量差异",""],["序号","DWH多的合同","DWH少的的合同"]],columns=["序号",'ODS','DWH'])Summary=Summary.append(SummaryDataVolumeVarianceHeader)Summary=Summary.append(DataFrame_DataVolume_Count_result)if DataFrame_DataVolume_Count_result.shape[0]<5:for i in  range(5-DataFrame_DataVolume_Count_result.shape[0]+2):Summary=Summary.append(Empty_Line_DataFrame)FieldValueDifferenceHeader=pd.DataFrame([["","各个字段差异TOP10",""]],columns=["序号",'ODS','DWH'])Summary=Summary.append(FieldValueDifferenceHeader)Summary=Summary.append(Difference_Field_Comparison_Data)Summary=Summary.append(Empty_Line_DataFrame)workbook = xlsxwriter.Workbook(TargetPath)# 添加不同的sheet.worksheet1 = workbook.add_worksheet("对比结果")# header格式.bold = workbook.add_format({'bold': 2})headersbold = workbook.add_format({'bold': 1})headers = list(Summary.columns)# 列宽.worksheet1.set_column('A:D', 16)worksheet1.set_column('C:C', 20)worksheet1.set_column('B:B', 25)# 行高.worksheet1.set_row(0, 18, bold)worksheet1.write_row('A1', headers)worksheet1.autofilter('A1:D9999')# worksheet1.autofilter(0, 0, 10, 3)  # 和上边的作用一样,不同写法.row = 1for row_data in (Summary.values.tolist()):worksheet1.write_row(row, 0, row_data)row += 1format1 = workbook.add_format({ # 先把样式打包,然后之后赋值即可'bold': True, # 字体加粗'text_wrap': True, # 是否自动换行'valign': 'bottom',  #垂直对齐方式'align': 'center', # 水平对齐方式'bg_color': '#C5D9F1', # 单元格背景颜色'border': 1,# 边框})  for n in ['ODS','DWH','字段','序号','数据','合同量差异','Report完整度','完成','百分比']:worksheet1.conditional_format('A1:D999', {'type':     'text','criteria': 'containing','value':    n,'format':   format1})#worksheet1.merge_range('A2:C2')#worksheet1.merge_range('A6:C6')worksheet1.merge_range(0,0,0,2,'生成自动对比结果',format1)worksheet1.merge_range(1,0,1,2,'数据量',format1)worksheet1.merge_range(5,2,5,0,'完整度',format1)worksheet1.merge_range(9,2,9,0,'合同量差异',format1)worksheet1.merge_range(18,2,18,0,'各个字段差异TOP10',format1)workbook.close()def success(self):#使用infomation信息框QMessageBox.information(None,"运行成功!","已生成对比文件",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)def RunAnLiu(self):print("运行")path=self.path_file#print(path)DATA_ODS=pd.read_excel(path,sheet_name="ODS")DATA_DWH=pd.read_excel(path,sheet_name="DWH")Primarykey1=self.getText01()Primarykey2=self.getText02()if Primarykey2=='':Primarykey=Primarykey1else:Primarykey=Primarykey1+ Primarykey2TargetPath=self.TargetPathself.retrieveData(TargetPath,Primarykey,DATA_ODS,DATA_DWH)self.success()print("运行成功!")

【Python】| 基于Python实现对比Excel的小工具相关推荐

  1. 使用python制作读取示波器波形的GUI小工具

    使用python制作读取示波器波形的GUI小工具 1.使用python创建GUI界面,该界面可以读取CSV数据格式的示波器波形并绘制在GUI界面上 2.可以zoom缩放操作 3.源码见链接 https ...

  2. 基于POI的读写Excel文件的工具类

    依赖的jar包: import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea ...

  3. 一个基于C#开发的Excel转Json工具

    Json在程序开发中是非常常用的数据格式,对于程序员来说,阅读和编辑Json都没有什么问题,但其他人就不是那么方便了.比如配置游戏数据:游戏角色.技能.道具的名称,策划书往往都是通过Excel配置,这 ...

  4. 基于Qt5.15的CRC校验小工具开发项目

    基于Qt5.15的CRC校验小工具开发项目 前言 一.开发准备 二.开发流程 1.Qt配置与界面设置 2.控件基本配置 3.CRC算法介绍 4.信号与槽的四个响应事件 5.打包发布 总结 前言 近期用 ...

  5. python基于pygame的飞机大作战小游戏

    基于pygame的飞机大作战小游戏,适合新手,不能直接运行,只能在命令行进入当前游戏目录,输入python game.py才能够运行,尚不知道是什么原因 游戏截图如下,我们用黄色的圆圈代表敌机, 代码 ...

  6. python日志分析工具_基于Python3的Web日志分析小工具

    PyWebLog 网站日志分析小工具 环境 Python3.5 Mysql 预览 安装 pip install pymysql pip install flask 导入日志 python Log.py ...

  7. python用tkinter实现qq_Python+Tkinter 密保小工具-阿里云开发者社区

    昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码.当然了,这件事也给了我一个警示,那就是定期的更换自己的QQ密码,会比较的安全. 然后就自己写了个密码保护的小工具. ...

  8. python基于Python的资产管理系统毕业设计-附源码201117

    摘 要 现代企业管理越来越强调利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用.安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本.资产管理系统为企业提供 ...

  9. 80行代码自己动手用python写一个表格拆分与合并小工具

    大家好,我是才哥. 可能是最近加班熬夜太多,这个周末身体不舒服,头痛.冷汗什么的.终于在连着睡了接近2天后,现在慢慢恢复了. 最近有新朋友看到之前<>,想问下有没有免费的小工具,可以进行表 ...

最新文章

  1. 牛客竞赛语法入门班数组模拟、枚举、贪心习题【未完结】
  2. 比特币的超能力:永恒不变
  3. python selenium_自动化测试:Selenium+Python环境搭建
  4. bootstrap 模态窗口按钮位置_Bootstrap模态框(modal)垂直居中
  5. Mybatis(持久层的框架),注入的三种方式
  6. 用HTML来做导航栏
  7. R plot图片背景设置为透明_万能转换:R图转成Word、PPT、Excel、HTML、Latex、矢量图等...
  8. 顺势腹式呼吸还是逆势
  9. Compilation failed to complete
  10. Build input file cannot be found:
  11. IT企业职业道德的反思
  12. 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解
  13. 红旗linux8.0安装教程,RedHat Linux 红旗9.0安装图解
  14. Hadoop学习与使用
  15. java8日期时间格式化与解析
  16. DNS域名解析过程详解
  17. SQL练习——经典50题
  18. 织梦模板dedecms文件名介绍与说明
  19. python GSM模块-电脑接收短信
  20. Android实战技巧之十六 getprop与dumpsys命令

热门文章

  1. Eclipse官网快速下载
  2. 宏碁掠夺者Predator首款RGB内存条即将发售,特挑三星B-Die颗粒
  3. SQL Server数据库-表
  4. 如何有效提高APP排名和下载量(上)
  5. 如何在Excel中使用公式将生日自动转换成星座?
  6. jsp中div 标签到底有什么用?
  7. pygame战棋游戏制作之战棋地图绘制(一)
  8. Docker提交天池比赛流程
  9. word文档生成系列:doc和docx插入多图
  10. 衣服挂牌 挂牌吊牌(麻绳,五彩绳,尼龙绳等)