首页 > 编程语言 >比较不同的excel,或者同一个excel的两个不同sheet页,并将不同之处标红,python代码实现

比较不同的excel,或者同一个excel的两个不同sheet页,并将不同之处标红,python代码实现

时间:2024-08-02 09:28:43浏览次数:15  
标签:origin sheet python max excel num 标红 col row

import openpyxl
from openpyxl.styles import PatternFill
#对比两个sheet,数据一致性校验
# 获取sheet对象的某一行
def getRow(sheet, rowNo):
    try:
        rows = []
        for row in sheet.iter_rows():
            rows.append(row)
        return rows[rowNo - 1]
    except Exception as e:
        raise e
def getCol(sheet, rowNo):
    try:
        rows = []
        for row in sheet.iter_rows():
            rows.append(row)
        return rows[rowNo - 1]
    except Exception as e:
        raise e
# 获取指定坐标单元格的值
def getCellOfValue(sheet, coordinate=None, rowNo=None, colsNo=None):
    if coordinate != None:
        try:
            return sheet.cell(coordinate=coordinate).value
        except Exception as e:
            raise e
    elif coordinate is None and rowNo is not None and \
            colsNo is not None:
        try:
            return sheet.cell(row=rowNo, column=colsNo).value
        except Exception as e:
            raise e
    else:
        raise Exception("insufficient Coordinates of cell!")

print("----------对比程序运行START------------------")
origin_file = r"D:\Desktop\归档表.xlsx"
target_file = r"D:\Desktop\39归档表.xlsx"

# 把源文件和目标文件加载到内存对象
wb_origin = openpyxl.load_workbook(origin_file)
wb_target = openpyxl.load_workbook(target_file)

# 通过sheet名拿到sheet对象
target_sheet = wb_origin["ora"]
origin_sheet = wb_origin["rds"]

# 获得最大行号
origin_sheet_max_row = origin_sheet.max_row
target_sheet_max_row = target_sheet.max_row

##获得最大列号
origin_sheet_max_column = origin_sheet.max_column
target_sheet_max_column = target_sheet.max_column

if origin_sheet_max_column != target_sheet_max_column:
    print("2个文件列数不一致,请检查")
if origin_sheet_max_row != target_sheet_max_row:
    print("2个文件行数不一致,请检查")
print("—————————对比程序进行中,开始循环遍历——————————————————————")
print("origin_sheet_max_row",origin_sheet_max_row)
for row_no in range(1, origin_sheet_max_row + 1):
    row = getRow(origin_sheet, row_no) #获取一行。
    #col = getCol(origin_sheet, col_no)
    row_length = len(row)
    #print("row_length:",row_length)
    #col_length = len(col)
    col_num = 1  # 列号,从第一列开始比较,逐个单元格做对比。
    red_fill = PatternFill("solid", fgColor="FF0000")
    while col_num < row_length +1:
        #print(getCellOfValue(origin_sheet, rowNo=row_no, colsNo=col_num))
        print(getCellOfValue(target_sheet, rowNo=row_no, colsNo=col_num))
        if getCellOfValue(origin_sheet, rowNo=row_no, colsNo=col_num) != getCellOfValue(target_sheet, rowNo=row_no,
                                                                                    colsNo=col_num):
            print(row_no,col_num,"asdfsdfsadf")
            print("第%s行%s列单元格的数据比对结果不一致,源:%s" %(
            row_no, col_num, getCellOfValue(origin_sheet, rowNo=row_no, colsNo=col_num)))
            row[col_num - 1].fill = red_fill
            print("给源文件单元格%s打标" % row[col_num - 1])
        else:
            pass
        col_num += 1
wb_origin.save(origin_file)
print("---------对比程序运行结束END------------")
#** ** ** ** ** ** ** **
#使用前请把主键放在A1列并排序,保持两份文件顺序完全一致。
#该程序的问题在于:两边主键必须完全顺序一致,
#如A文件为
#1,2,3,4,5
#B文件为
#2,3,4,5,6
#那么对比就会出现问题

#如果两边不一致,则在源文件把不一致的单元格填充背景色为红色
#** **/

标签:origin,sheet,python,max,excel,num,标红,col,row
From: https://blog.csdn.net/m0_38111284/article/details/140765143

相关文章

  • Python连接MinIO:实现高效的对象存储管理
    文章目录概要环境准备Python连接MinIO注意事项小结概要在云计算和大数据领域,对象存储因其可扩展性、高可用性和成本效益而备受青睐。MinIO是一个高性能的分布式对象存储服务器,它兼容AmazonS3云存储服务API。使用Python连接MinIO,你可以轻松地在你的应用程序中集成对......
  • python中字典的学习
    字典(dict)目录字典(dict)字典的概念字典操作字典的遍历字典的常用方法字典的概念dictionary(字典)是除列表以外python之中最灵活的数据类型字典同样可以用来存储多个数据通常用于存储描述一个物体的相关信息和列表的区别列表是有序的对象集合字典是无序的对象集合......
  • Python连接MinIO进阶教程:文件类型指定、上传与获取预览链接
    文章目录概要1.指定文件内容类型2.获取文件的预览链接(PresignedURL)使用fput_object上传文件4.完整示例与总结概要在上一篇文章中,我们介绍了如何使用Python连接MinIO服务器,并进行了基本的文件上传和下载操作。这次,我们将深入探讨一些进阶功能,包括在上传文件时指......
  • Python装饰器
    Python装饰器TableofContents引子函数式调用语法糖加上参数login函数有参数装饰器本身有参数装饰有返回值的函数多个装饰器灵活运用想理解Python的装饰器,首先要知道在Python中函数也是一个对象,所以可以:将函数赋值给变量将函数当做参数返回一个函数......
  • excel中XX天XX小时XX分XX秒累加
    1、图1时长在A1:A100。B1输入=IF(ISNUMBER(FIND("天",A1)),LEFT(A1,(FIND("天",A1)-1)),"")下拉填充至B100,C1输入=IF(B1="",IF(ISNUMBER(FIND("小时",A1)),LEFT(A1,(FIND("小时",A1)-1)),""),MID(A1,FIND("天"......
  • Python数据容器(2)
    一、数据容器:tuple(元组)1.定义同列表一样,但是形成后不可修改单个元组需要加上单独的逗号2.特定可以容纳多个数据可以不同数据类型混装运行数据重复不可修改支持循环3.特例元组中如果有list列表,则可以修改list中的数据4.常用操作下标查询语法:元组.index(元素)统计个......
  • Python数据容器(1)
    一、数据容器入门1.定义一份变量多个数据一个数据称为1个元素2.特点是否支持重复元素是否可以修改是否有序3.类别列表(list)元组(tuple)字符串(str)集合(set)字典(dict)二、数据容器:list(列表)1.下标索引把列表元素取出来(左到右0→123)(右到左-1→-123)序号也可......
  • 初学Python:第五天
    今天学习了有关于字典的定义和相关操作:1、新增元素语法:字典[key]=value结果:字典被修改,新增了元素更新元素语法:字典[key]=value结果:字典被修改,元素被更新注意:字典key不可以重复,所以对已存在的key执行上述操作,就是更新value值2、删除元素语法:字典.pop(Key)结果:获得......
  • 在 Python 生成器中使用“with”语句管理资源
    今天,在编程时,我发现自己在生成器函数内管理资源(ssh连接),类似于以下内容:def_yield_fname(host_address,usr,pwd,datapath):withparamiko.SSHClient()asssh_client:ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.......
  • Avro:在 Python 中使用多处理进行解码
    就最佳性能和更少延迟而言,哪种异步方法更适合解码从Kafka主题消耗的Avro消息?我正在使用Avro库的并发future,并且我仍然可以看到类似的执行时间与不使用并发future的情况相比。fromavro.ioimportBinaryDecoder,DatumReaderfromconfluent_kafka.avro.cached_sc......