多个excel表数据比对操作

多个excel表数据比对操作

本文主要使用两种方法进行比对,分别使用了openpyxl第三方库和pandas第三方库进行数据比对
两种方法优缺点:
openpyxy:
优点:主要是处理xlsx的文件,里面方法简单,易懂
缺点:当数据量大的时候,速度很慢,之前我一条一条数据拿出来比较,两百多条数据花了三个多小时,目前经过优化,速度上得到大幅度提升-约1分钟内,主要是一列一列的数据拿出来做比较,不在一条一条比较,这样速度得到了提升,但是没有之前直接获取某一列某一行的值做比对方便,需要考虑行数和列数!
pandas:
优点:可以处理xls、xlsx等多种文件,且速度很快
缺点:比较难懂,没有openpyxl那样丰富多样化

下面展示代码openpyxy:

class DoExcel_xlsx:
    def __init__(self,file_name1,sheet_name1,file_name2,sheet_name2):
        try:
            self.file_name = file_name1
            # self.file_name2 = file_name2
            # self.sheet_name = sheet_name1
            # self.sheet_name2 = sheet_name2
            self.workbook = openpyxl.load_workbook(file_name1)
            self.workbook2 = openpyxl.load_workbook(file_name2)
            self.sheet = self.workbook[sheet_name1]
            self.sheet2 = self.workbook2[sheet_name2]
        except Exception as e:
            print('case文件格式有误:{}'.format(e))

    def get_case(self):
        #创建一个列表,里面存放A列的数据
        ii1 = []
        ii2=[]
        for i in self.sheet['A']:
            ii1.append(i.value)
        for i in self.sheet2['A']:
            ii2.append(i.value)
        print(ii1)
        print(ii2)
        max_row = self.sheet.max_row
        max_row2 = self.sheet2.max_row
        x = 1
        for r in range(2,len(ii1)+1):
            product_id = self.sheet.cell(row= r, column= 1).value #获取基金代码
            gzjz = self.sheet.cell(row= r, column= 10).value

            print('表1:----{}'.format(product_id))

            for i in  range(1,len(ii2)+1):
                product = self.sheet2.cell(row=i, column=1).value
                print('表2--{}'.format(product))
                print(product)
                if product_id == product :
                    gzjz2 = self.sheet2.cell(row=i, column=10).value
                    shang = self.sheet2.cell(row=i, column=8).value
                    xia = self.sheet2.cell(row=i, column=9).value
                    if gzjz == gzjz2:
                        print('没问题')
                        continue
                    elif gzjz != gzjz2:
                        self.write_result(x,1,product_id)
                        self.write_result(x,2,gzjz)
                        self.write_result(x, 3, product)
                        self.write_result(x, 4, gzjz2)
                        x = x+1
                        continue
                    continue

            if product_id not in ii2 :
                self.write_result(x,1,product_id)
                self.write_result(x, 2, gzjz)
                x = x+1
                continue

            self.workbook.close()

    def write_result(self,row,col,productid):
        sheet = self.workbook['sheet2']
        sheet.cell(row,col).value = productid
        # sheet.cell(row,col).value = result
        self.workbook.save(filename=self.file_name)在这里插入代码片

这里面,先把主列数据拿出来存做列表,通过两张表比对,找出存在A表但是不存在B表的数据,还有共同数据中不同的净值,然后新建一张sheet表存入数据,PS:这里这能通过找到A表中存在但是B表不存在的数据和共同数据,如果需要找到B表存在但是A表不存在的数据,需要把两张表顺序颠倒再运行一次

pandas代码如下:

class pandas_xls:
    def __init__(self,file_name1,sheet_name1,file_name2,sheet_name2):
        #按str读取文件,不做数据转换
        df1 = pd.read_excel(file_name1, dtype='str',sheet_name=sheet_name1)
        df2 = pd.read_excel(file_name2, dtype='str',sheet_name=sheet_name2)
        # print(df1.iloc[0])  #读取第一行,也可使用 df1.iloc[0]
        # print(df1['基金代码'])  #读取基金代码该列
        # row = 0
        li1 = df1['基金代码'].values
        li2 = df2['基金代码'].values
        # print(type(li1))
        # print(li2)
        # print(li1+li2)
        a = list(set(list(li1)+list(li2))-set(li1))
        print(a)
        b = list(set(list(li1)+list(li2))-set(li2))
        print(b)
        c = []
        d = []

        a1 = []
        b1 = []
        c1 = []
        d1 = []
        for r in list(set(li1).intersection(set(li2))):  # set(li1).intersection(set(li2))集合运算-交集
            rows_with_data1 = df1[df1['基金代码'] == r]
            rows_with_data2 = df2[df2['基金代码'] == r]
            row1 = rows_with_data1.index[0]  # 特定数据所在行
            # print(row1)
            row2 = rows_with_data2.index[0]  #
            # print(row2)
            try:
                gzsy1 = df1.loc[row1, '单位净值-估值']
            except KeyError as e:
                gzsy1 = None
            print(gzsy1)
            try:
                gzsy2 = df2.loc[row2, '单位净值-估值']
            except KeyError as e:
                gzsy2 = None

            print(gzsy2)
            if gzsy1 != gzsy2 :
                a1.append(r)
                b1.append(r)
                c1.append(gzsy1)
                d1.append(gzsy2)

        if a:  #找出df2中存在的数据
            print('只在df2中存在的数据{}'.format(a))
            for i in a:
                rows_with_data = df2[df2['基金代码'] == i]
                row = rows_with_data.index[0] # 特定数据所在行
                print('df2中:{}数据所在行{}'.format(i, row))
                # 查找这行数据的特定列的值
                try:
                    gzsy2 = df2.loc[row, '单位净值-估值']
                except KeyError as e:
                    # if pd.isnull(df2.loc[row, '单位净值-估值']):
                    gzsy2 = None
                    # else:
                    #     print('检查{}数据是否有问题'.format(row))
                print('gzsy2:{}'.format(gzsy2))
                c.append(gzsy2)

        if b:
            print('只在df1中存在的数据{}'.format(b))
            print(b)
            for i in b:
                rows_with_data = df1[df1['基金代码'] == i]
                row = rows_with_data.index[0]  # 特定数据所在行
                print('df1中:{}数据所在行{}'.format(i, row))
                # 查找这行数据的特定列的值
                try:
                    gzsy1 = df1.loc[row, '单位净值-估值']
                except KeyError as e:
                    # if pd.isnull(df1.loc[row, '单位净值-估值']):
                    gzsy1 = None
                    # else:
                    #     print('检查{}数据是否有问题'.format(row))
                print('gzsy1:{}'.format(gzsy1))
                d.append(gzsy1)
        # for r in range(len(a)):
        #     b.append(None)
        b[0:0] = [None]*len(a)
        d[0:0] = [None]*len(a)
        df = pd.DataFrame.from_dict({'估值3基金代码': a1 + a,
                                     '万份收益-估值3': c1+c,
                                     '估值6基金代码':  b1+b,
                                     '万份收益-估值6': d1+d,
                                     }, orient='index')   #创建dataframe数据表
        df = df.transpose()


        writer = pd.ExcelWriter('比对数据.xlsx')  # 创建ExcelWrite对象
        df.to_excel(writer)
        writer.close()

这里,逻辑和上方一样:也是获取相关列,然后数据进行比对,,但是做了一些为空的处理,而且可以找出两张表中分别不存在的数据依次存入新表中,

推荐使用第二种pandas方法

武汉派先科技有限公司推出的<>专业版是市场上最为强大便捷的Excel比较工具。它为工作中经常需要进行数据比较的用户提供了完美的解决方案。无论你的数据是存放在Excel文件,还是存放在文本文件,或者存放在Access、Microsoft SQL数据库,<>专业版都可以提供快速比较,大量节省您的时间和精力,将您从枯燥冗长的数据海洋中解放出来,从而让您的工作变得轻松愉快。 <>专业版不同于其它同类产品。其它同类产品在比较时候,要么是一个插件,要么需要显式地在前台运行Excel程序。而百分百比较Excel完全独立运行,与后台的Excel程序协同完成工作,不需要来回切换程序。 本产品的主要特性点: 1、 支持对任意Excel内容的比较 • 比较整个工作簿(workbook),并且可以对工作簿中的每个工作进行单独的比较设置 • 比较整个工作(worksheet),并允许多种比较设置 • 比较工作中的已命名区域(named range),并允许多种比较设置 • 比较工作中用户运行时自由选定的任何区域(range),并允许多种比较设置 2、 支持对远程数据的比较 • 支持从文本文件(Text/CSV)中导入数据比较 • 支持从Access数据库中导入数据比较 • 支持从微软SQL数据库中导入数据比较 3、支持灵活的多种比较设置 • 支持按第一行名字配对比较 • 支持按Excel所在列位置配对比较 • 支持按范围(range)内的单元坐标配对比较 (同一坐标的单元配对比较) • 支持用户自由定义的列映射配对比较 • 支持值和公式的比较 • 支持大小写区分 • 所有的比较设置均可保存供下次调用 4、自动生成XML格式的比较结果报 • XML格式保留对差异单元的加亮显示 • XML格式使您的生意伙伴对比较结果的自动再处理(程序处理)成为可能 • XML格式允许没有安装微软Excel的生意伙伴用互联网浏览器进行显示比对 • XML格式也允许你在Excel对比较结果进行显式和分析 5、原始Excel文件和比较结果显示在同一个程序窗口中,无需切换 6、可一键快速定位比较结果对应的原始Excel单元 7、独特的比较算法,即使大量的数据也可快速比较 8、友好的用户界面,让你的操作轻松自如.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值