鱼C论坛

 找回密码
 立即注册
查看: 1400|回复: 19

[已解决]小白自己写了个excel快速核对代码,遇见问题,求助。

[复制链接]
发表于 2020-8-9 00:43:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 seslovelm 于 2020-8-9 20:46 编辑

一、实现思路
1. 使用xlrd库操作excel表格
2. excel创建两个表单,分别为sheet1和sheet2,行数列数都相同
3. 使用双层循环,遍历对应的单元格,如果有不一样的,则将sheet1对应的单元格打印出来
4. 保存至 找不同.txt文件中

二、整体代码
import xlrd
test = xlrd.open_workbook('这个放文件名')  # 注意!此处需要改成自己的excel表名
sheet1 = test.sheet_by_index(0)  # 通过索引获取指定工作表,用sheet来接收
rowNum1 = sheet1.nrows
colNum1 = sheet1.ncols
sheet2 = test.sheet_by_index(1)  # 通过索引获取指定工作表,用sheet来接收
rowNum2 = sheet2.nrows
colNum2 = sheet2.ncols

for i in range(0, rowNum1):
     for j in range(0, colNum1):
     data1 = sheet1.cell_value(i, j)
     data2 = sheet2.cell_value(i, j)
      if data1 != data2:
           print(i, j, ' ', data2)
            with open('./找不同.txt', 'a', encoding='utf-8')as f:
             f.write("第%s行,第%s列\t值为:%s\n" % (i, j, data2))


本人写了个excel自动核对数据代码,但是发现个问题,程序运行核对1万条数据以上,就会卡死。
还有就是程序必须是A列表与B列表顺序 排列一致,条数必须一致才能使用,有没有大佬,能帮忙优化下?就是比如A列表7000条数据,B列表7200条数据,这样也可以快速核对,找出数值一样的,不一样的自动标注成红色。
本人在鱼C论坛,自学了1个半月写出来的程序,能力有限,求各位大佬帮忙下。谢谢。
最佳答案
2020-8-15 00:58:22
from openpyxl  import load_workbook
from openpyxl.styles import colors,PatternFill
import pandas as pd


def Read_Excel():
    data1=pd.read_excel('1.xlsx',keep_default_na=False)
    print(data1)
    data2=pd.read_excel('2.xlsx',keep_default_na=False)
    data1=data1.reset_index().astype('str')
    data1.rename(columns={'index':'index1'},inplace=True)
    data2=data2.reset_index().astype('str')
    data2.rename(columns={'index':'index2'},inplace=True)
    data3=data1.merge(data2,left_on='transaction_reference_number',right_on='交易日志号',how='outer')
    print(data3)
    data3.to_excel('3.xlsx')
    return data3

def Fill_Color(in_filename,out_filename,index):
    fill = PatternFill("solid", fgColor=colors.RED)
    wb1=load_workbook(in_filename)
    ws1=wb1['Sheet1']
    con_max = ws1.max_column
    for i in index:
        for j in range(1,con_max+1):
            ws1.cell(row=int(i)+2,column=j).fill=fill
    wb1.save(out_filename)

data3=Read_Excel()
index_excel1=[]
index_excel2=[]
for i in data3.index:
    if (data3.loc[i,'debit_amount'] !=data3.loc[i,'支出金额']) or (data3.loc[i,'credit_incurred_amount'] !=data3.loc[i,'收入金额'])\
            or (data3.loc[i,'account_balance'] !=data3.loc[i,'本次余额']):
        index_excel1.append(data3.loc[i,'index1'])
        index_excel2.append(data3.loc[i,'index2'])

index_excel1=list(set(index_excel1))[1:]
index_excel2=list(set(index_excel2))[1:]
print(f'索引1:{index_excel1}')
print(f'索引2:{index_excel2}')
Fill_Color('1.xlsx','3.xlsx',index_excel1)
Fill_Color('2.xlsx','4.xlsx',index_excel2)
也不知道是不是你想要的,只能写成这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 17:10:32 | 显示全部楼层
这个怎么发在技术交流???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 20:47:12 | 显示全部楼层
额,没有大佬帮忙解决下问题么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 20:50:57 | 显示全部楼层
陈尚涵 发表于 2020-8-9 17:10
这个怎么发在技术交流???

那发求助区?还是发在什么区呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 08:56:04 | 显示全部楼层
seslovelm 发表于 2020-8-9 20:50
那发求助区?还是发在什么区呢?

发在问题交流区啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 13:45:05 | 显示全部楼层
用pandas试试
表格抬头是  姓名        身份证号        年龄        地址
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Border, Font, Side

def Set_excel_style(file_name):  #设置表格为文本格式
    wb = load_workbook(f'{file_name}')  # 打开文件
    ws = wb['Sheet1']  # 打开表格
    for row in ws.rows:  # 获取所有行
        for cell in row:  # 获取所有行中的每一个单元格
            cell.font = Font(name=u'微软雅黑', size=11)  # 设置字体
            cell.border = Border(left=Side(border_style="thin", color='000000'),
                                 right=Side(border_style="thin", color='000000'),
                                 top=Side(border_style="thin", color='000000'),
                                 bottom=Side(border_style="thin", color='000000'))  # 设置边框格式
            cell.alignment = Alignment(horizontal='center')  # 设置居中
            cell.number_format = '@'  # 设置为文本格式
    wb.save(f'{file_name}')  # 保存文件


data_one=pd.read_excel('1.xlsx',sheet_name='Sheet1',dtype={'身份证号':str,'年龄':str})  #原始大数据
data_two=pd.read_excel('2.xlsx',sheet_name='Sheet1',dtype={'身份证号':str,'年龄':str})  #需查找的小数据


data_same=data_one[data_one['身份证号'].isin(data_two['身份证号'])]  #两个表一致的数据
data_notsame=data_one[~data_one['身份证号'].isin(data_two['身份证号'])]  #两个表不一致的数据


data_same.to_excel('3.xlsx',sheet_name='Sheet1',index=False)
Set_excel_style('3.xlsx')
data_notsame.to_excel('4.xlsx',sheet_name='Sheet1',index=False)
Set_excel_style('4.xlsx')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 22:59:02 | 显示全部楼层
疾风怪盗 发表于 2020-8-10 13:45
用pandas试试
表格抬头是  姓名        身份证号        年龄        地址

我是用来核对银行流水交易明细,是根据收入,支出,余额,核心流水号,交易日期 来核对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-12 00:31:50 | 显示全部楼层
seslovelm 发表于 2020-8-11 22:59
我是用来核对银行流水交易明细,是根据收入,支出,余额,核心流水号,交易日期 来核对。

不是一样的么?给的是个思路,要么你就给原数据,否则只能自己学啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-12 10:48:43 From FishC Mobile | 显示全部楼层
建议贴个表格示例上来,把一些隐私信息替换掉。说明清楚自己要以什么作为依据,去比较哪些内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-12 23:28:30 | 显示全部楼层
debit_amountcredit_incurred_amountaccount_balancetransaction_datetransaction_reference_number支出金额收入金额本次余额交易日期交易日志号
0.00
6335.64
59675482.85
2020/7/31 0:00
67889927
16
9,900.00
 
59709476.37
20200727
61578653
0.00
1093.10
59675448.95
2020/7/31 0:00
66221133
15
6,300.00
59699576.37
20200727
61578923
0.00
1093.10
59674355.85
2020/7/31 0:00
63558755
14 
960.00
59705876.37
20200727
61578933
0.00
129.69
59673262.75
2020/7/31 0:00
64995735
13
0.00
30,318.53
59706836.37
20200728
61578953
1007.55
0.00
59676517.84
2020/7/31 0:00
68546334
12
0.00
450.30
59707286.67
20200728
66789723
0.00
2201.55
59677525.39
2020/7/31 0:00
68975753
11
0.00
456.30
59707742.97
20200729
63547843
0.00
1132.40
59675323.84
2020/7/30 0:00
69875374
10
450.30
0.00
59707292.67
20200729
66877894
0.00
35.03
59674191.44
2020/7/30 0:00
66874435
9
1,326.44
0.00
59674156.41
20200730
65789423
1326.44
0.00
59674156.41
2020/7/30 0:00
65789423
8
0.00
35.03
59674191.44
20200730
66874435
450.30
0.00
59707292.67
2020/7/29 0:00
66877894
7
0.00
1,132.40
59675323.84
20200730
69875374
0.00
456.30
59707742.97
2020/7/29 0:00
63547843
6
0.00
2,201.55
59677525.39
20200731
68975753
0.00
450.30
59707286.67
2020/7/28 0:00
66789723
5
1,007.55
0.00
59676517.84
20200731
68546334
0.00
30318.53
59706836.37
2020/7/28 0:00
61578953
4
0.00
129.69
59673262.75
20200731
64995735
960.00
59705876.37
2020/7/27 0:00
61578953
3
0.00
1,093.10
59674355.85
20200731
63558755
6321.00
59699576.37
2020/7/26 0:00
61578753
2
0.00
1,093.10
59675448.95
20200731
66221133
9900.00
59709476.37
2020/7/26 0:00
61578953
1
0.00
6,335.64
59675482.85
20200731
67889927
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-12 23:29:28 | 显示全部楼层
nianyi 发表于 2020-8-12 10:48
建议贴个表格示例上来,把一些隐私信息替换掉。说明清楚自己要以什么作为依据,去比较哪些内容

已经发了表格上来,大佬帮忙看看,如何核对出正确的数据,标记出不正确的数据?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-12 23:31:29 | 显示全部楼层
疾风怪盗 发表于 2020-8-12 00:31
不是一样的么?给的是个思路,要么你就给原数据,否则只能自己学啊

我发了一个表格模板出来,原数据,大佬帮忙看看,如何自动核对出正确的数据标绿色,不正确的数据标注红色, 还是按照以前的 数据库英文开头的数据列表,放在A表格,中文开头的网银账单的数据放在B表格,自动核对之后,生成一个新的Excel表文件出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 00:52:21 | 显示全部楼层
你是要相同交易日志号下的数据不一致,核对交易日志号下的数据是不是正确?还是两个表是不是存在不同交易日志号?两个表合成一个表输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 09:00:43 | 显示全部楼层
疾风怪盗 发表于 2020-8-13 00:52
你是要相同交易日志号下的数据不一致,核对交易日志号下的数据是不是正确?还是两个表是不是存在不同交易日 ...

是要找出两个表得,收入,支出,余额,交易日志,自动对比,找出不一样得,然后自动生成一个新Excel,标注红色。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 10:35:44 | 显示全部楼层
seslovelm 发表于 2020-8-13 09:00
是要找出两个表得,收入,支出,余额,交易日志,自动对比,找出不一样得,然后自动生成一个新Excel,标 ...


你没明白我的意思,A表内的交易日志号和B表内的交易日志号一样的情况下,收入、支出、余额可能不一致,需要找出来,是这个意思?还是说两个表是否存在不一致的交易日志号?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 00:13:04 | 显示全部楼层
疾风怪盗 发表于 2020-8-13 10:35
你没明白我的意思,A表内的交易日志号和B表内的交易日志号一样的情况下,收入、支出、余额可能不一致, ...

两个表格存在,收入,支出,余额,交易日志号,都不一样的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 09:24:20 | 显示全部楼层
seslovelm 发表于 2020-8-14 00:13
两个表格存在,收入,支出,余额,交易日志号,都不一样的情况。

建议使用vba
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 21:45:53 | 显示全部楼层
搞不定,放弃了,感觉总归要全部遍历一次,不知道论坛大神有没有简便的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 22:27:21 | 显示全部楼层
疾风怪盗 发表于 2020-8-14 21:45
搞不定,放弃了,感觉总归要全部遍历一次,不知道论坛大神有没有简便的方法

是有点难度,我原先问了个女大神,她说很简单,加个if就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 00:58:22 | 显示全部楼层    本楼为最佳答案   
from openpyxl  import load_workbook
from openpyxl.styles import colors,PatternFill
import pandas as pd


def Read_Excel():
    data1=pd.read_excel('1.xlsx',keep_default_na=False)
    print(data1)
    data2=pd.read_excel('2.xlsx',keep_default_na=False)
    data1=data1.reset_index().astype('str')
    data1.rename(columns={'index':'index1'},inplace=True)
    data2=data2.reset_index().astype('str')
    data2.rename(columns={'index':'index2'},inplace=True)
    data3=data1.merge(data2,left_on='transaction_reference_number',right_on='交易日志号',how='outer')
    print(data3)
    data3.to_excel('3.xlsx')
    return data3

def Fill_Color(in_filename,out_filename,index):
    fill = PatternFill("solid", fgColor=colors.RED)
    wb1=load_workbook(in_filename)
    ws1=wb1['Sheet1']
    con_max = ws1.max_column
    for i in index:
        for j in range(1,con_max+1):
            ws1.cell(row=int(i)+2,column=j).fill=fill
    wb1.save(out_filename)

data3=Read_Excel()
index_excel1=[]
index_excel2=[]
for i in data3.index:
    if (data3.loc[i,'debit_amount'] !=data3.loc[i,'支出金额']) or (data3.loc[i,'credit_incurred_amount'] !=data3.loc[i,'收入金额'])\
            or (data3.loc[i,'account_balance'] !=data3.loc[i,'本次余额']):
        index_excel1.append(data3.loc[i,'index1'])
        index_excel2.append(data3.loc[i,'index2'])

index_excel1=list(set(index_excel1))[1:]
index_excel2=list(set(index_excel2))[1:]
print(f'索引1:{index_excel1}')
print(f'索引2:{index_excel2}')
Fill_Color('1.xlsx','3.xlsx',index_excel1)
Fill_Color('2.xlsx','4.xlsx',index_excel2)
也不知道是不是你想要的,只能写成这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表