python两个表格数据核对,并把正确、错误、缺少的数 据用颜色标记出来

老板又安排了一个工作,需要结合表格信息对基础台账核对,默默将台账导出来一看,2000多条,不管了,先用刚学的python操练一下。

具体要求:有两个个表格,其中表1是台账信息,上面有厂站名称,设备名称,以及其他的重要信息,由于时间久没有更新,存在部分错误的台账,暂时需要结合表2基础信息进行逐一核对。

python两个表格数据vlookup python两个表格对账_数据


表二是重新核对过的设备信息,不过只有厂站名称和间隔信息,需要以此为准进行核对,并要求核对出正确的台账,标出不正确的,补充缺失的,头都大了。

python两个表格数据vlookup python两个表格对账_python两个表格数据vlookup_02


万幸这几天在自学python关于excel相关内容,想想可以使用python解决,真是不幸中的万幸。先上代码:

# code=utf-8
import xlrd
import xlwt
from xlutils.copy import copy  # 用于变读取excel数据和边修改表格内容

# 本程序的作用是通过检查表一中的间隔,对比表二进行进行检查,检查正确刷黄色,错误刷红色,增补的为蓝色,在最后面补充,未标注的未核对的,

style_1 = xlwt.easyxf('pattern: pattern solid, fore_colour 5;')  # 单元格格式设置为黄色
style_2 = xlwt.easyxf('pattern: pattern solid, fore_colour red;')  # 单元格格式设置为红色
style_3 = xlwt.easyxf('pattern: pattern solid, fore_colour blue;')  # 单元格格式设置为蓝色

# 1 white,2 red,3 green,4blue,5 yellow,7 cyan,16 maroon,17 dark green,18 dark blue,19 dark yellow,

all_date_taizhang = []
all_date_muban = []
all_date_buchong = []
biandianzhan = ''
num_taizhang = 1
num_muban = 3
num_buchong = 0

print('本程序是依据变电站间隔名称表对保护装置20200226进行核对,检查正确刷黄色,错误刷红色,未标注的是未进行查询,缺少的在最后面补充,确保查询前表格无颜色,输入要查询的工作表位于第几个表,从0开始,本程序执行一次即可,否则可能导致重复增加缺少设备,显示查询结束后表示完成!')
print('特别提示:本程序会修改原数据表,执行前做好数据备份!!!')
print('特别提示:本程序会修改原数据表,执行前做好数据备份!!!')
print('特别提示:本程序会修改原数据表,执行前做好数据备份!!!')
'''try:
    Num_sheet = int(input('开始执行查询操作,请输入:'))  # 输入查询的变电站在第几个工作表
except ValueError:  # 输入非数字,执行下一条提醒
    print('输入的不是数字,请重新启动程序')
    exit()'''  # 这几条程序本次没有使用,

taizhang_xlsx = xlrd.open_workbook('保护装置20200226.xls', formatting_info=True)  # 打开表一个工作簿
taizhang_xlsx_sheet = taizhang_xlsx.sheet_by_index(0)  # 打开第一个工作表

muban_xlsx = xlrd.open_workbook('变电站间隔名称表.xls', formatting_info=True)  # 打开表二个工作簿,注意表格不能是xlsx格式
muban_xlsx_sheet = muban_xlsx.sheet_by_index(0)  # 打开输入的工作表

taizhang_row = taizhang_xlsx_sheet.nrows  # 读取表1总列数,用于后期统计
muban_row = muban_xlsx_sheet.nrows  # 读取表2总列数,用于后期统计

for i in range(num_taizhang, taizhang_row):  # 读取总的行数
    key_taizhang_biandianzhan = taizhang_xlsx_sheet.cell(i, 6).value  # 读取表1中变电站名称
    key_taizhang_jiangemingcheng = taizhang_xlsx_sheet.cell(i, 9).value  # 读取变电站间隔名称

    date_taizhang = {'key_taizhang_biandianzhan': key_taizhang_biandianzhan,
                     'key_taizhang_jiangemingcheng': key_taizhang_jiangemingcheng}  # 设置字典
    all_date_taizhang.append(date_taizhang)  # 将表1中数据写入列表
print('表1数据复制成功!!!')

for j in range(num_muban, muban_row):  # 读取总的行数
    key_muban_biandianzhan = muban_xlsx_sheet.cell(j, 0).value  # 读取表1中变电站名称
    key_muban_jiangemingcheng = muban_xlsx_sheet.cell(j, 1).value  # 读取变电站间隔名称

    date_muban = {'key_muban_biandianzhan': key_muban_biandianzhan,
                  'key_muban_jiangemingcheng': key_muban_jiangemingcheng}  # 设置字典
    all_date_muban.append(date_muban)  # 将表1中数据写入列表
print('表2数据复制成功!!!')

print('开始执行查询操作....................')

new_taizhang_workbook = copy(taizhang_xlsx)  # 使用copy,将表一数据复制到新表中,作用是可以变查询边修改
new_taizhang_worksheet = new_taizhang_workbook.get_sheet(0)

new_muban_workbook = copy(muban_xlsx)  # 使用copy,将表二数据复制到新表中,作用是可以变查询边修改
new_muban_worksheet = new_muban_workbook.get_sheet(0)

for l in all_date_taizhang:
    taizhang_biandianzhan = l['key_taizhang_biandianzhan']  # 取表一中变电站名称
    taizhang_jiangemingcheng = l['key_taizhang_jiangemingcheng']  # 读取表一中间隔名称

    print('查询中....................')

    thecell1 = taizhang_xlsx_sheet.cell(num_taizhang, 9)  # 读取表一表格颜色,连续的4条是读取单元格的颜色
    xfx = taizhang_xlsx_sheet.cell_xf_index(num_taizhang, 9)
    xf = taizhang_xlsx.xf_list[xfx]
    bgx = xf.background.pattern_colour_index

    for k in all_date_muban:
        muban_biandianzhan = k['key_muban_biandianzhan']
        muban_jiangemingcheng = k['key_muban_jiangemingcheng']

        thecell2 = muban_xlsx_sheet.cell(num_muban, 1)  # 读取表二表格颜色
        xfx2 = muban_xlsx_sheet.cell_xf_index(num_muban, 1)
        xf2 = muban_xlsx.xf_list[xfx2]
        bgx2 = xf2.background.pattern_colour_index

        if (str(taizhang_biandianzhan) in str(muban_biandianzhan)) and (
                str(taizhang_jiangemingcheng) == str(muban_jiangemingcheng)) and (bgx == 64) and (
                (bgx2 == 64)):  # 用于判断厂站名称包含,间隔名称相同,并且表一,表二对应的单元格都为白色

            new_taizhang_worksheet.write(num_taizhang, 6, taizhang_biandianzhan, style_1)  # 将将台账数据重新写入单元格,并设置颜色
            new_taizhang_worksheet.write(num_taizhang, 9, taizhang_jiangemingcheng, style_1)
            new_muban_worksheet.write(num_muban, 0, muban_biandianzhan, style_1)
            new_muban_worksheet.write(num_muban, 1, muban_jiangemingcheng, style_1)

            bgx = 65  # 作用是将查询到的cell颜色值加1,避免后面的elif对该cell重新着色
            bgx2 = 65

        elif (str(taizhang_biandianzhan) in str(muban_biandianzhan)) and (
                str(taizhang_jiangemingcheng) != str(muban_jiangemingcheng)) and (bgx == 64):
            print('有缺少的间隔....................', taizhang_jiangemingcheng)
            new_taizhang_worksheet.write(num_taizhang, 6, taizhang_biandianzhan, style_2)  # 将将台账数据重新写入单元格,并设置颜色
            new_taizhang_worksheet.write(num_taizhang, 9, taizhang_jiangemingcheng, style_2)

        num_muban = num_muban + 1  # 用于记录表二中执行的行数

    num_taizhang = num_taizhang + 1  # 行数增加1,填到心的表格中
    num_muban = 3  # 循环万后重新幅值

new_muban_workbook.save('变电站间隔名称表.xls')

print('开始补充缺少设备-------')

# 单元格颜色设置后,在查询输出结果不对,不得已将文件保存后重新载入就正常了

muban_xlsx = xlrd.open_workbook('变电站间隔名称表.xls',
                                formatting_info=True)  # 打开表二个工作簿,注意表格不能是xlsx格式,formatting_info=True表示格式有效,读取单元格颜色必须使用
muban_xlsx_sheet = muban_xlsx.sheet_by_index(0)  # 打开工作表

num_muban = 3  # 第四行开始计算
for j in range(num_muban, muban_row):  # 读取总的行数
    key_buchong_biandianzhan = muban_xlsx_sheet.cell(j, 0).value  # 读取表1中变电站名称
    key_buchong_jiangemingcheng = muban_xlsx_sheet.cell(j, 1).value  # 读取变电站间隔名称

    date_buchong = {'key_buchong_biandianzhan': key_buchong_biandianzhan,
                    'key_buchong_jiangemingcheng': key_buchong_jiangemingcheng}  # 设置字典
    all_date_buchong.append(date_buchong)  # 将表1中数据写入列表
print('表2数据重新复制成功!!!')

num_muban = 3
for k in all_date_buchong:
    buchong_biandianzhan = k['key_buchong_biandianzhan']
    buchong_jiangemingcheng = k['key_buchong_jiangemingcheng']

    thecell2 = muban_xlsx_sheet.cell(num_muban, 1)  # 读取表二表格颜色
    xfx2 = muban_xlsx_sheet.cell_xf_index(num_muban, 1)
    xf2 = muban_xlsx.xf_list[xfx2]
    bgx2 = xf2.background.pattern_colour_index

    if (bgx2 == 64):
        new_taizhang_worksheet.write(num_buchong + taizhang_row, 6, buchong_biandianzhan, style_3)
        new_taizhang_worksheet.write(num_buchong + taizhang_row, 9, buchong_jiangemingcheng, style_3)
        num_buchong = num_buchong + 1
        print('增加台账个数', num_buchong)
    num_muban = num_muban + 1

new_taizhang_workbook.save('保护装置20200226.xls')

print('查询结束,并重新更新文件..........')

最终顺利完成任务,相同的设备单元格黄色,错误的显示黑色,缺少的使用蓝色补充。在调试过程中,也发现出现一些问题,同时也增长了一些知识,比如读取单元格格式参考程序,没有彻底掌握,python自学相对还是比较困难,特别是碰到问题的时候,只能一个人默默的百度,不过好在大神非常多,在实际中学习中碰到的问题也逐一解决,在此感谢前辈们的辛苦付出。
后期要学习如何将程序简化,以及用更加方便的方法实现功能,不过暂时已经具备基本功能,后期计划对该代码实现更丰富的功能。
记录与2020年2月28日凌晨。