python 实现两个excel表格数据的对比--代码:
from openpyxl import load_workbook
import os
import time
from psutil import net_if_addrs
import pickle
import sys
import json
from colorama import init
from colorama import Fore,Back,Style
from openpyxl.styles import PatternFill # 导入背景色
gloablist=[] #
# 把excel表格中第六列device id 31010100581394000030 -->20设备id,把上述设备id都是放入gloablist列表中
# 然后把列表中数据存储进入db.json文件中
def impotdatalib():
gloablist = []
pvg10 = input("pvg数据导出的gbid表格入库:")
pvg10 = pvg10.strip()
if (not pvg10.endswith("xlsx")):
pvg10 = (pvg10 + ".xlsx")
print("生成入库索引文件,请等待...")
wb = load_workbook(pvg10)
sheet = wb["data"] #单元薄必须是“data"
max_row = sheet.max_row+1
print("导入数据rows:",max_row)
max_column = sheet.max_column+1
print("导入数据columns:",max_column)
for i in range(1, max_row):
for j in range(1, max_column):
if (j == 6): # device id 31010100581394000030 -->20设备id
gbid=sheet.cell(row=i, column=6).value
gloablist.append(gbid)
print("入库数据总量为:",len(gloablist))
with open("db.json","w",encoding="utf8") as fjson:
json.dump(gloablist,fjson,ensure_ascii=False) #ensure_ascii=False 避免中文乱码
def mtheread():
sumcount=len(gloablist) #总数
errcount=0 #异常数据数量
stdcount=0 #正常数量
# 表格try EXCEPTIO变量的初始化变量
wbdevice=""
sheetdestdevide=""
sz3=""
print("=========欢迎使用EXCEL表格对比内容事项============")
while True:
try:
sz3 = input("请输入数据治理数据表格,表名sheet[ck]:")
print(Fore.GREEN+"数据正在预处理中,请稍等...")
print(Fore.GREEN+"======================..")
sz3=sz3.strip()
if (not sz3.endswith("xlsx")):
sz3 = (sz3 + ".xlsx")
wbdevice = load_workbook(sz3) #对方的表格数据读入系统
sheetdestdevide = wbdevice["ck"] #请输入数据治理数据表格de sheet--->工作簿 ck
except Exception as e:
print(e,"输入表格名称错误,请重新输入!")
continue
# 如果成功就是break跳出循环,继续执行下面的代码
break
max_row = sheetdestdevide.max_row+1
# print(max_row)
max_column = sheetdestdevide.max_column+1
# print(max_column)
for i in range(1,max_row):
for j in range(1,max_column):
if(j==1): #对方的excel表格的数据在第一列
checkvalue=sheetdestdevide.cell(row=i, column=j).value #取出检测值 “31010100581394000030”
# print(checkvalue,"qian")
checkvalue=checkvalue.strip() #处理检测值多于的符号 如空格等
# print(checkvalue,"国标ID检测中...")
# if sheetdestdevide.cell(row=i,column=j).value==sheet.cell(row=i,column=6).value:
if checkvalue in gloablist: #如果检测值在列表中,就是标准数据stdcount加1
stdcount=stdcount+1
# print("i行%d,j列%d"%(i,j))
sheetdestdevide.cell(row=i, column=16).value=1 #如果检测值在列表中,这个excel表格的第16列数值为1
# print("第三列的成绩:",sheetdestdevide.cell(row=i, column=3).value)
print(Fore.GREEN+checkvalue+" "+"GBID CHECK....")
else:
sheetdestdevide.cell(row=i, column=16).value = 0 #如果检测值在列表中,这个excel表格的第16列数值为0
# sheetdestdevide.cell(row=i, column=16).fill=PatternFill("solid",fgColor="99ccff") #单元格加背景色
sheetdestdevide.cell(row=i, column=16).fill=PatternFill("solid",fgColor="ff0000") #单元格加背景色--红色
errcount=errcount+1 #错误数据加1 计数
print(Fore.RED+checkvalue+" "+"GBIDCHECK....") #打印颜色是红色的
# print(f"本次检测总数是{sumcount},标准国标id数据数量是{stdcount},需要关注的国标id数量是{errcount};")
print(Fore.RED+"正在生成数据中,请稍等。。。")
# 保存文件名称
newSave="Dest_{}".format(sz3)
# wbdevice.save("./newdest.xlsx") #保存数据
wbdevice.save(newSave) #保存数据
print("{}数据已经生成,请去目录中查询!".format(newSave))
print(f"本次检测检测库总数是{sumcount},检测总数据量为{stdcount+errcount};标准国标id数据数量是{stdcount},需要关注的国标id数量是{errcount};")
print(time.sleep(1))
# 文档使用说明:
def helpdb():
msg="""
=============================两个EXCEL表格数据对比分析==============================
前提:两个表格,表格1是:工作簿是data 表格2工作簿是ck;
1.导入excel表格数据,重点关注第六列数据是否是国标编号【31010100581394000030】20位编码;
同时表格的工作簿一定要是“data"
2.数据检测表格,重点关注第一列【待检测的编号】,以及第16列【数据写入状态1,0】
同时表格的工作簿一定要是“ck"
3.运行“数据检测”稍等一会就是在当前目录下生成“Dest_”开头的文件,关注第16列有1的就是说明有这个数据,0的就是没有这个数据
=============================两个EXCEL表格数据对比分析==============================
"""
print(msg)
def dydata():
print(gloablist[:10])
# 函数字典,对上上面的函数,函数引用的调用,不是函数值的调用。
func_dic = {
'1':impotdatalib,
'2':mtheread,
'3':helpdb,
'4':dydata,
}
if __name__ == '__main__':
if os.path.exists("db.json"):
print("db.json数据加载中....")
# 启动程序后就是把json文件内容整体读取到gloablist列表中,用于检索数据
with open("db.json","r",encoding="utf8")as fr:
gloablist=json.load(fr)
print("数据加载完毕!")
while True:
print('''
===两个excel表格数据对比,对比方式GBID===
===========功能列表===========
1.写入数据并且配置,必须先入库
[如果程序目录下有DB.JSON文件,已经入库,不用再入库!]
2.数据检测
3.使用说明
4.打印列表前10条数据
''')
choice = input('请输入功能编号:').strip()
if choice not in func_dic:
print("输入正确的编号:")
continue
func_dic.get(choice)()



