python两个表格数据核对,并把正确、错误、缺少的数 据用颜色标记出来
老板又安排了一个工作,需要结合表格信息对基础台账核对,默默将台账导出来一看,2000多条,不管了,先用刚学的python操练一下。
具体要求:有两个个表格,其中表1是台账信息,上面有厂站名称,设备名称,以及其他的重要信息,由于时间久没有更新,存在部分错误的台账,暂时需要结合表2基础信息进行逐一核对。
表二是重新核对过的设备信息,不过只有厂站名称和间隔信息,需要以此为准进行核对,并要求核对出正确的台账,标出不正确的,补充缺失的,头都大了。
万幸这几天在自学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日凌晨。