精华内容
下载资源
问答
  • EXCEL对比
    2022-01-14 18:10:12

    1、解释说明:读数据库数据,转换成字典;取excel数据数据,转换成字典;再写一个对比两个字典的方法。

        1.1、封装的类(里面不需要动)

                

    import pandas as pd
    import pymysql
    import openpyxl
    
    
    class sql_excel:
        # 通过类的__init__函数,初始化数据
        def __init__(self, data_sql, excel_path, col_start, col_end):
            self.data_sql = data_sql
            self.excel_path = excel_path
            self.col_start = col_start
            self.col_end = col_end
    
        # sql_data 查询数据库数据
        def sql_for(self):
            db = ""
            dc_dict = {}
            try:
                # 打开数据库连接
                db = pymysql.connect(
                    host="192...........",
                    port=3306,
                    user="root",
                    password="root123",
                    database="zh..........",
                    charset="utf8",
    
                )
                sql = self.data_sql
                df_sql = pd.read_sql(sql, db)
                # 取出全部行,迭代输出,保存在字典中。
                for index, row in df_sql.iterrows():
                    dc_dict[list(row.values)[0]] = list(row.values)[1:]
                # 返回数据库字典
                return dc_dict
    
            except:
                # Rollback in case there is any error
                db.rollback()
            finally:
                db.close()
    
        # 取出excel的值,迭代输出,保存在字典中(按行迭代输出)
        def pc_for(self):
            # 路径参数
            str_path = self.excel_path
            wb_pc = openpyxl.load_workbook(str_path)
            ws_pc = wb_pc.active
    
            dictA_pc = {}
            dict_tile_pc = ""
    
            # 指定区域中的位置
            col_start = self.col_start
            col_end = self.col_end
            for row in ws_pc[col_start: col_end]:
                # 遍历每一行中的每一单元格
                x = 0
                listS_pc = []
                for c in row:
                    x += 1
                    if x == 1:
                        dict_tile_pc = c.value
                    else:
                        listS_pc.append(c.value)
                dictA_pc[dict_tile_pc] = listS_pc
            return dictA_pc
    
        # 数据库sql与excel对比
        def dict_compare(self):
            global key
            # 保存缺少行value(错误信息保存)
            listS = []
            # 保存缺少行名(错误信息保存)
            listL = []
            str1 = self.pc_for()
            str2 = self.sql_for()
            # 1、先输出一个其中一个字典的key和values
            # 2、直接拿着这个values和另一个字典中的的values对比。
            # 3、str2[key][list_i]可以先通过key,拿到一个字典的value
            # 4、两个value的值确定了,就可以比较了。把错误信息保存在list列表中。
            try:
                for key, value in str1.items():
                    for list_i, list_value in enumerate(value):
                        if list_value != str2[key][list_i]:
                            li_error = key, ":", list_value
                            listS.append(li_error)
            except:
                listL.append(key)
            #  判断excel是否定位正确
            try:
                if key is None:
                    return "excel 定位错误"
                else:
                    return "行value错误:", listS, "缺少行名:", listL
            except:
                return "excel 定位错误"
    
    
    

         1.2、调用封装的类,对比数据(单次调用)。

                 

    import srcd.t_data.py_sql_excel as pyResult
    
    sql = "select *, sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU', " \
          "concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/" \
          "sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi' " \
          "from( " \
          "select t.company_name as 'company_n1',SUM(t.actual_num) as 'actual_n1', " \
          "sum(CASE t.boxType WHEN '20GP' THEN 1  ELSE 0   END) as '20GP'," \
          "sum(CASE t.boxType WHEN '20RF' THEN 1  ELSE 0   END) as '20RF', " \
          "sum(CASE t.boxType WHEN '40RF' THEN 1  ELSE 0   END) as '40RF', " \
          "sum(CASE t.boxType WHEN '40HC' THEN 1  ELSE 0   END) as '40HC', " \
          "sum(CASE t.boxType WHEN '40RH' THEN 1  ELSE 0   END) as '40RH', " \
          "sum(CASE t.boxType WHEN '20' THEN 1  ELSE 0   END) as '20n', " \
          "sum(CASE t.boxType WHEN '40' THEN 1  ELSE 0   END) as '40n', " \
          "sum(CASE t.boxType WHEN '特殊' THEN 1  ELSE 0   END) as 'tsn' " \
          "from dm_container_volume t " \
          "GROUP BY t.company_name) ta " \
          "group by ta.company_n1"
    
    str_path = "./dataFile/pc_for.xlsx"
    col_start = "B3"
    col_end = "M4"
    
    result_se = pyResult.sql_excel(sql, str_path, col_start, col_end).dict_compare()
    print(result_se)
    
    
    
    

      1.2、用for循环通过取字典的k,v值,来对比多张不同维度的报表

                  

    import srcd.t_data.py_sql_excel as pyResult
    import time
    
    # 用for循环通过去字典的k,v值,来对比多张不同维度的报表
    zd_str_path = {"company_name": "./dataFile/pc_for.xlsx"}
    for zd, str_path in zd_str_path.items():
        sql = "select *, sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU', " \
              "concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/" \
              "sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi' " \
              "from( " \
              f"select t.{zd} as 'company_n1',SUM(t.actual_num) as 'actual_n1', " \
              "sum(CASE t.boxType WHEN '20GP' THEN 1  ELSE 0   END) as '20GP'," \
              "sum(CASE t.boxType WHEN '20RF' THEN 1  ELSE 0   END) as '20RF', " \
              "sum(CASE t.boxType WHEN '40RF' THEN 1  ELSE 0   END) as '40RF', " \
              "sum(CASE t.boxType WHEN '40HC' THEN 1  ELSE 0   END) as '40HC', " \
              "sum(CASE t.boxType WHEN '40RH' THEN 1  ELSE 0   END) as '40RH', " \
              "sum(CASE t.boxType WHEN '20' THEN 1  ELSE 0   END) as '20n', " \
              "sum(CASE t.boxType WHEN '40' THEN 1  ELSE 0   END) as '40n', " \
              "sum(CASE t.boxType WHEN '特殊' THEN 1  ELSE 0   END) as 'tsn' " \
              "from dm_container_volume t " \
              f"GROUP BY t.{zd}) ta " \
              "group by ta.company_n1"
    
        col_start = "B3"
        col_end = "M4"
    
        result_se = pyResult.sql_excel(sql, str_path, col_start, col_end).dict_compare()
        time.sleep(2)
        print(result_se)
    

             

       

    2、pandas 遍历 dataframe 行数据

            

    import pandas as pd
    inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
    df = pd.DataFrame(inp)
    print(df)
    
    # pandas 遍历 dataframe 行数据
    for index, row in df.iterrows():
        print(index,row[0],row[1],)
    
    # pandas 遍历 dataframe 列数据
    for x in df.loc[:,'c1']:
        print(x)
    
    

    3、 pandas抽取行列数据_zhf的博客-CSDN博客_pandas取列值https://blog.csdn.net/weixin_43283397/article/details/104263743

    4、

        4.1、创建一个字典,把数据放在字典里,字段名称是key,字段内容是values(也可以理解成迭代输出列,并保存字典中)

       4.2、pymysql,pandas,mysql一起来操作数据库,并保存在excel中

    import pandas as pd
    import pymysql
     
    db = ""
     
     
    def mysql_conn():
        global db
        try:
            # 打开数据库连接
            db = pymysql.connect(
                host="localhost",
                port=3306,
                user="root",
                password="dong2025",
                database="mysql8",
                charset="utf8",
     
            )
            sql = "SELECT * FROM BOOK"
            df_sql = pd.read_sql(sql, db)
            # return df_sql  # 展示所有结果
            return df_sql.head()  # 默认展示前5行
            # return df_sql.head(2)  # 展示前2行
            # return df_sql.shape   # 统计行和列数。
            # return df_sql.info()  # info()方法可以查看数据表中的数据类型
            # return df_sql.describe()  # 对BOOK表的描述
     
        except:
            # Rollback in case there is any error
            db.rollback()
        finally:
            db.close()
     
     
    my_con = mysql_conn()
    my_con.to_excel("C:/Users/Administrator/Desktop/123456/202201101647.xlsx")
    print(my_con)
    print("***************************")
     
    # 创建一个字典,把数据放在字典里,字段名称是key,字段内容是values
    t_dict = {}
    for x, y in my_con.items():
        print("x=", x, "y=", list(y.values))
        t_dict[x] = list(y.values)
    print("t_dict=", t_dict)
    print("**********************")
     
    # 根据字段名称取数据
    print(my_con["book_name"] + " " + my_con["writer"])

    5、 case  when的用法详解

    SQL之CASE WHEN用法详解__Rt-CSDN博客_case when用法https://blog.csdn.net/rongtaoup/article/details/82183743

          5.1、自己写的例子:

     

     5.2、根据上面的图片,生成虚拟的列(不需要分组)

     

    select 
       sum(CASE WHEN t.score< 60 THEN 1 ELSE 0 END) as "小于60(不包含60)",
       sum(CASE WHEN 60<=t.score and t.score< 80 THEN 1 ELSE 0 END) as "大于60小于80(包含60,不包含80)",
       sum(CASE WHEN 80<=t.score and t.score< 100 THEN 1 ELSE 0 END) as "大于80小于100(不包含100,包含80)"
    from student_table t

     生成效果:

      

     

    5.3、生成虚拟的行(需要分组)

    select (CASE 
    	WHEN t.score<60 THEN 
    		"小于60(不包含60)"
    	WHEN t.score<80 THEN
    		"大于60小于80(包含60,不包含80)"
    	WHEN t.score<100 THEN
    		"大于80小于100(不包含100,包含80)"
    	ELSE
    		"其他"
    END) as score_levev, count(t.id)  as stu_cnt
    from student_table t
    GROUP BY
    (CASE 
    	WHEN t.score<60 THEN
    		"小于60(不包含60)"
    	WHEN t.score<80 THEN
    		"大于60小于80(包含60,不包含80)"
    	WHEN t.score<100 THEN
    		"大于80小于100(不包含100,包含80)"
    	ELSE
    		"其他"
    END)

     

    6、case when的用法

          里面还有数据库脚本

    case when 的用法举例说明_Jack_2085-CSDN博客https://blog.csdn.net/weixin_54217632/article/details/122510989?spm=1001.2014.3001.5501

       case when代码例子说明:

    
    --  ---- 1、虚拟多列的需要用把case when分开单独写。
    --  ---- 2.1、虚拟一列内容需要通过判断填写的,比如性别列,
    --  ---- 2.2、内容需要填写(男/女),可以把casewhen写在一起,
    --  ---- 2.3、一个end结束符,一个as 别名就ok了,
    --  ---- 2.4、根据不同情况,用不同方法。
    
    -- -------------------- 实现方法(完整版写法)
    -- --------------------  ELSE 0  也可以不要
    
    select *,
    sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU',
    concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/
    sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi'
    from(
    select t.company_name as 'company_n1',SUM(t.actual_num) as 'actual_n1', 
      sum(CASE t.boxType WHEN '20GP' THEN 1  ELSE 0   END) as '20GP',
      sum(CASE t.boxType WHEN '20RF' THEN 1  ELSE 0   END) as '20RF',
      sum(CASE t.boxType WHEN '40RF' THEN 1  ELSE 0   END) as '40RF',
      sum(CASE t.boxType WHEN '40HC' THEN 1  ELSE 0   END) as '40HC',
      sum(CASE t.boxType WHEN '40RH' THEN 1  ELSE 0   END) as '40RH',
      sum(CASE t.boxType WHEN '20' THEN 1  ELSE 0   END) as '20n',
      sum(CASE t.boxType WHEN '40' THEN 1  ELSE 0   END) as '40n',
      sum(CASE t.boxType WHEN '特殊' THEN 1  ELSE 0   END) as 'tsn'
    from dm_container_volume t
    GROUP BY t.company_name) ta
    group by ta.company_n1
    
    
    
    

    7、

    8、

    9、

    10、

    11、

    12、

    13、

    14、

    15、

    16、

    17、

    18、

    19、

    20、

    21、

    22、

    23、

    24、

    25、

    26、

    27、

    28、

    29、

    30

    更多相关内容
  • excel对比小程序

    2018-09-18 09:56:10
    这个是一个自己写的excel对比的小程序.需要的话拿,有s
  • Excel对比工具.zip

    2021-12-10 10:53:28
    C#应用开发源码资源工具
  • excel对比工具.exe

    2020-09-28 15:10:25
    1、该工具可一键查询excel表格重复数据并记录到日志文件 2、该工具可一键查询2个表格不同,并记录到日志文件 3、该工具可一键将excel表格转成cvs文件 4、该工具可一键将cvs转成excel表格
  • 需求由于工作当中经常需要对比前后两个 Excel 文件,文件内容比较多,人工肉眼对比太费劲,还容易出错,搞个 Python 小工具,会不会事半功倍运行脚本,可以把前后两个 Excel 文件当中不同的内容数据展现出来,不同 ....

    今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍!

    需求

    由于工作当中经常需要对比前后两个 Excel 文件,文件内容比较多,人工肉眼对比太费劲,还容易出错,搞个 Python 小工具,会不会事半功倍

    375a272d176fc4e16c9f95a80b44290a.png

    运行脚本,可以把前后两个 Excel 文件当中不同的内容数据展现出来,不同 sheet 页签表示不同的数据处理结果

    需求解析

    不需要解析,直接干

    代码实现

    我们先导入两份测试数据,进行 old 和 new 的处理,注意数据中 account number 是唯一索引

    old = pd.read_excel('sample-address-1.xlsx', 'Sheet1', na_values=['NA'])
    new = pd.read_excel('sample-address-2.xlsx', 'Sheet1', na_values=['NA'])
    old['version'] = "old"
    new['version'] = "new"

    75a7cca2ac4c8ed52b813bde0790e168.png

    对于我们这个小工具,主要考虑三种变化类型

    • 哪些是新增的 account

    • 哪些是被删除的 account

    • 哪些是被修改的 account

    对于新增和删除的 account,我们可以直接用两份数据相减即可

    old_accts_all = set(old['account number'])
    new_accts_all = set(new['account number'])
    
    dropped_accts = old_accts_all - new_accts_all
    added_accts = new_accts_all - old_accts_all

    bf1f770a2775b4af355737316d8ea889.png

    接下来我们再将所有的数据拼接到一起,并使用 drop_duplicates 来保留被修改的数据

    all_data = pd.concat([old,new],ignore_index=True)
    changes = all_data.drop_duplicates(subset=["account number",
                                               "name", "street",
                                               "city","state",
                                               "postal code"], keep='last')

    9625c375bec255a6fe599ad800fcab18.png

    接下来,我们需要找出哪些 account 有重复的条目,重复的 account 表明更改了我们需要标记的字段中的值。我们可以使用重复函数来获取所有这些 account 的列表,并仅过滤掉那些重复的 account

    dupe_accts = changes[changes['account number'].duplicated() == True]['account number'].tolist()
    dupes = changes[changes["account number"].isin(dupe_accts)]dupe_accts = changes[changes['account number'].duplicated() == True]['account number'].tolist()dupes = changes[changes["account number"].isin(dupe_accts)]

    f23d9e2fb81325d0be3822f4fe78e578.png

    现在我们将旧数据和新数据进行拆分,删除不必要的版本列并将 account 设置为索引

    change_new = dupes[(dupes["version"] == "new")]
    change_old = dupes[(dupes["version"] == "old")]
    change_new = change_new.drop(['version'], axis=1)
    change_old = change_old.drop(['version'], axis=1)
    change_new.set_index('account number', inplace=True)
    change_old.set_index('account number', inplace=True)
    df_all_changes = pd.concat([change_old, change_new],
                                axis='columns',
                                keys=['old', 'new'],
                                join='outer')
    df_all_changes

    51d0b37dca116b1c30d736e35a805928.png

    接下来我们定义一个函数来展示从一列到另一列的变化

    def report_diff(x):
        return x[0] if x[0] == x[1] else '{} ---> {}'.format(*x)def report_diff(x):    return x[0] if x[0] == x[1] else '{} ---> {}'.format(*x)

    现在使用 swaplevel 函数来获取彼此相邻的旧列和新列

    041e565e3cebb659f66eeda06910240f.png

    最后我们使用 groupby 然后应用我们自定义 report_diff 函数将两个相应的列相互比较

    df_changed = df_all_changes.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))
    df_changed = df_changed.reset_index()df_changed = df_all_changes.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))df_changed = df_changed.reset_index()

    2c335ab74a505a99bd200e984c846623.png

    接下来我们需要找出被删除和新增的数据

    df_removed = changes[changes["account number"].isin(dropped_accts)]
    df_added = changes[changes["account number"].isin(added_accts)]df_removed = changes[changes["account number"].isin(dropped_accts)]df_added = changes[changes["account number"].isin(added_accts)]

    我们可以使用单独的选项卡将所有内容输出到 Excel 文件,对应于更改、添加和删除

    output_columns = ["account number", "name", "street", "city", "state", "postal code"]
    writer = pd.ExcelWriter("my-diff.xlsx")
    df_changed.to_excel(writer,"changed", index=False, columns=output_columns)
    df_removed.to_excel(writer,"removed",index=False, columns=output_columns)
    df_added.to_excel(writer,"added",index=False, columns=output_columns)
    writer.save()

    最后,我们就得到了最开始的效果图片展示的一个新的 Excel 文件

    当然上面的代码对于毫无编程的人来说还是有一点点复杂,我们还是做成 GUI 小程序吧,这次我们使用 Tkinter 来编写 GUI 程序

    我们首先导入 Tkinter 库并进行初始化

    import tkinter
    from tkinter import *
    from tkinter import Label, Button, Entry, messagebox
    from tkinter import filedialog
    from deal import deal_excel
    
    
    window = tkinter.Tk()
    path_file1 = StringVar()
    path_file2 = StringVar()
    path_path = StringVar()
    window.geometry('380x150')

    这里我们定义了三个 String 类型的变量,用来保存文件地址和文件夹路径

    然后我们进行简单的页面排版,只需要用到 Label,Entry 和 Button 就够了

    label1 = Label(window, text="文件1:").grid(column=0, row=0)
    txt1 = Entry(window, width="30", textvariable=path_file1).grid(column=1, row=0)
    button1 = Button(window, text="文件选择1", command=selectFile1).grid(column=2, row=0)
    
    label2 = Label(window, text="文件2:").grid(column=0, row=1)
    txt2 = Entry(window, width="30", textvariable=path_file2).grid(column=1, row=1)
    button2 = Button(window, text="文件选择2", command=selectFile2).grid(row=1, column=2)
    
    label3 = Label(window, text="新文件路径:").grid(column=0, row=2)
    txt3 = Entry(window, width="30", textvariable=path_path)
    txt3.grid(column=1, row=2)
    button3 = Button(window, text="新文件路径", command=selectPath).grid(row=2, column=2)
    
    button4 = Button(window, text="开始处理", command=save_path).grid(row=3, column=1)

    59e70ac5c316db6760da79f96e12bd65.png

    用于获取文件和文件夹的函数

    def selectFile1():
        path_ = filedialog.askopenfilename()
        path_file1.set(path_)

    用于保存新生成文件和提示消息的函数

    def save_path():
        path = txt3.get()
        deal_excel(path)
        res = "对比处理完成!"
        messagebox.showinfo('萝卜大杂烩', res)

    这样,一个简单的 Excel 对比工具就完成啦

    722b804dfd5622510a29596a3f9740f2.png

    好了,这样我们就完成了一个简易的 GUI 拆分 PDF 文件的工具喽

    喜欢就在看、点赞,转发,三连支持一下噻!

    END

    推荐阅读
    
    
    
    牛逼!Python常用数据类型的基本操作(长文系列第①篇)
    牛逼!Python的判断、循环和各种表达式(长文系列第②篇)
    
    牛逼!Python函数和文件操作(长文系列第③篇)
    
    牛逼!Python错误、异常和模块(长文系列第④篇)
    展开全文
  • excel 对比工具

    2014-03-19 20:30:41
    可以将两个excel进行对比,找出两个excel文件不同的单元格,并可以将其集中体现在一个文件中
  • Python实现简单的excel对比工具

    千次阅读 多人点赞 2021-04-19 04:01:36
    最近有小伙伴说需要一个工具,用来对比2个excel表的差异,直接标记出来有差异的行。 代码倒还挺简单的,为了方便小白使用,我给它打包成exe文件,点击执行即可输出结果。 1、先说一下怎么用,后面上代码 链接:...

    最近有小伙伴说需要一个工具,用来对比2个excel表的差异,直接标记出来有差异的行。

    代码倒还挺简单的,为了方便小白使用,我给它打包成exe文件,点击执行即可输出结果。

    1、先说一下怎么用,后面上代码

    链接:https://pan.baidu.com/s/1oNEeIDOnw1Grw2MOdJrwUQ
    提取码:w29l

    先到网盘链接,下载文件:
    如果不需要源代码,直接下载xlsx_compare.rar即可。

    在这里插入图片描述
    解压后打开:
    这里面2个xlsx文件是我用来测试的文件,可以直接换成你自己的,必须是2个,不要放其他文件。

    划重点:你的2个excel文件必须是xlsx格式的文件,且对比的内容放在Sheet1。
    在这里插入图片描述
    点击exe文件,结果如下:
    在这里插入图片描述
    会输出3份文件,第一个error_info.txt,就是执行过程中有报错的信息会写入到这文件里,运行正常的话里面写的是。
    在这里插入图片描述
    如果出现异常,例如你的2个对比文件忘记放进去了,error_info.txt就是这样的
    在这里插入图片描述
    另外2个new结尾的文件,就是对比的结果了,打开看看。
    在这里插入图片描述
    D列的数据因为长度超长,把它拉开就能看到内容了。
    对比发现不一致的话,会在最后一列Compare Result标记
    在这里插入图片描述
    像这样的话,说明2个文件的第5、6、7行不一致,第8行是因为test1.xlsx没有第8行数据,而test2.xlsx有,因此也标记出来。

    这样我们通过excel的筛选器过滤一下,就能得到2个文件不一致的所有行了
    在这里插入图片描述

    2、代码

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # date: 2021/4/17
    # filename: xlsx_compare
    # author: kplin
    
    import pandas as pd
    import os
    
    
    def my_log(info):
        try:
            with open('error_info.txt', 'w+') as f:
                f.write(info)
                f.close()
        except Exception as e:
            print('写入错误日志时发生以下错误:\n%s'%e)
    
    
    def get_file():
        try:
            # 获取当前文件夹下的2个文件
            dir_path = os.getcwd()
            files = os.listdir(dir_path)
            ret = []
            for i in files:
                if i.endswith('.xlsx') and not i.endswith('_new.xlsx'):
                    ret.append(i)
                if i.endswith('.xlsx') and not i.endswith('_new.xlsx') and '~$' in i:
                    info ='请关闭文件%s'%i
                    my_log(info)
                    return None
            if len(ret) == 0:
                info = '找不到待检测文件,请将2个xlsx文件放入此文件夹'
                my_log(info)
                return None
            # print(ret)
            return ret[0], ret[1]
        except Exception as e:
            my_log(str(e))
    
    
    
    def main(file1, file2):
        try:
            # 1、获取原文件路径和名称,先准备即将生成的新文件名和文件路径
            fname1, ext = os.path.splitext(os.path.basename(file1))
            new_file1 = file1.replace(fname1, fname1 + '_new')
    
            fname2, ext = os.path.splitext(os.path.basename(file2))
            new_file2 = file2.replace(fname2, fname2 + '_new')
    
            # 2、读取文件
            df1 = pd.read_excel(file1)
            df2 = pd.read_excel(file2)
    
            length = len(df1) if len(df1) >= len(df2) else len(df2)
    
    
            # 两个数据块行数不一致,补成一致的
            if len(df1) - len(df2) > 0:
                # 获取DF1的列名
                d = {}
                for i in df2.columns:
                    d[i] = ['' for x in range(len(df1) - len(df2))]
                concat_df = pd.DataFrame(d)
                df2 = pd.concat([df2, concat_df])
    
            if len(df2) - len(df1) > 0:
                d = {}
                for i in df1.columns:
                    d[i] = ['' for x in range(len(df2) - len(df1))]
                concat_df = pd.DataFrame(d)
                df1 = pd.concat([df1, concat_df])
    
    
            dis_index = []
    
            for i in range(len(df1)):
                ret = df1.iloc[i, :]==df2.iloc[i, :]
                if False in ret.tolist():
                    dis_index.append(i)
    
            dis_list = ['' for i in range(length)]
            for i in dis_index:
                dis_list[i] = '不一致'
    
            df1['Compare Result'] = dis_list
            df2['Compare Result'] = dis_list
    
            df1.to_excel(new_file1, index=False)
            df2.to_excel(new_file2, index=False)
            my_log('校验成功,本次对比文件为:%s%s 和 %s%s'%(fname1, ext, fname2, ext))
            print('校验完成,请查看新文件')
        except Exception as e:
            print('出现未知错误,请查看error_info.txt')
            my_log(str(e))
    
    if __name__ == '__main__':
        if not get_file():
            print('读取文件时发生错误,请查看error_info.txt')
        else:
            file1, file2 = get_file()
            main(file1, file2)
    

    总共有3个函数:

    1、my_log函数用来写入日志。

    2、get_file函数用来获取当前路径下所有后缀名为.xlsx的文件,会排除掉_new.xlsx文件,并且如果当前文件夹下有打开的excel文件,会自动结束运行,提示关闭当前文件夹下已被打开的excel文件。

    3、main函数用来处理比对,并输出结果:
    这里主要使用pandas读取数据并逐行对比,如果不一致,会记录下差异的位置,当检查完所有行后,给数据块加上一列Compare Result,把差异的行做一个标记,最后写入生成2个新文件。

    依赖包都在requirements.txt里:
    pandas 1.1.4
    openpyxl 3.0.7
    xlrd 1.2.0

    可以直接pip install -r requirements.txt,直接下载安装依赖包。

    逻辑很简单,但没有经过充分测试,可能遇到某些特殊情况会有其他报错,如果有的话,给我留言说明是什么情况导致的报错,有时间就改进一下。

    展开全文
  • 基于PyQt5+Python实现Excel内容对比
  • Excel 对比工具

    2012-08-10 17:11:07
    Excel 对比工具
  • Excel对比条形图

    千次阅读 2020-08-30 10:06:50
    最终效果 步骤 数据 同理设置,另一个(这里橙色条) 另一种做法 数据 . 将第二列数据改为负数。

    最终效果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    步骤

    数据

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    同理设置,另一个(这里橙色条)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    另一种做法
    数据
    .
    在这里插入图片描述

    将第二列数据改为负数。

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Excel对比数据差异方法总结

    千次阅读 2020-04-29 22:23:22
    Ctrl + /: ①选中要进行数据对比的一列,按住Ctrl,选中另一列; ②按住Ctrl + / ,有差异的单元格会被选中 ③选择填充,高亮有差异的数据 Ctrl +H:
  • excel对比两顺序不同的表格
  • EXCEL对比重复数据

    2019-01-10 09:02:00
    一、 EXCEL 突出重复项 1. 选择对应的数据 EXCEL 里选择好数据 2. 选择条件格式 这样就完成了数据重复的突出,可以按条件筛选。选择自己想要的数据 转载于:...
  • 近期项目需要,场景是有两个excel表格,一个是之前的旧表格,一个是新内容的表格,需要将两个不同的提取出来生成新的excel。python使用到的是pandas这个库,前提是需要安装python,和自己熟悉的开发工具。defdrop_...
  • excel对比两边数据去重

    千次阅读 2020-09-29 15:52:12
    需求:筛选重复数据,A列是1000条数据,C列是100条数据,删除重复的数据,只剩900条。 首先,A列数据要分列,因为数据格式不一样,会导致后面的问题,一直下一步到完成 第二步,在B和D列加数字1,相当于索引,...
  • 对比不同excel表格中相同列的内容差异
  • 两个excel进行比对,筛出存在的列,或者若存在,把一个表的某一列插入到另一个表的某一列
  • 参考: ... https://www.jb51.net/office/excel/524285.html ...这里对比C列和B列的大小:C列大于B列的数据(等同于 B列小于等于C列),用黄色底色标出C列里符合条件的数据 结果 ...
  • Excel对比两个Sheet数据的异同

    千次阅读 2020-07-14 16:14:03
    步骤一:数据列转行处理 转换后格式(插入 --> 数据透视表) 步骤二:数据对比(测试和生产)
  • Git Excel Diff 插件

    2020-11-26 09:49:33
    Git的一个插件比较Excel的差异,A free and open-source local Git extension
  • 实用经典EXCEL对比函数【工作总结】 实用经典 EXCEL 对比函数
  • excel对比 文档对比

    2012-02-09 15:40:24
    excel文档对比,很方便的进行文档的修改查找
  • excel对比工具

    2014-11-20 22:37:34
    Excel Compare 是一个比较Excel工作表的小巧实用工具。其执行的比较结果会生成在一个新创建的Excel“差别报告”工作表中,为用户显示Excel工作表里已经修改、添加或删除的数据。 软件是绿色破解版(中英文选择),...
  • EXCEL 在B1中 填写这个 =VLOOKUP(A1,C:C,1,0) 然后往下拉只要有出现#N/A说明已经离职了 公司需要 转载于:https://www.cnblogs.com/Borea/p/8520842.html
  • Sheet Comparator是一种工具,用于突出显示两个Excel文件,两个工作表,甚至是同一电子表格中的表格之间的差异。 它与其他excel比较器的不同之处在于,它可以像表一样对待数据库,也因为它可以直接在电子表格注释中...
  • Dim xls_app As New Excel.Application Dim xls_book As New Excel.Workbook Dim xls_sheet As New Excel.Worksheet Set xls_app = CreateObject("Excel.Application") Set xls_book = xls_app.Workbooks.Open...
  • Excel数据对比修复程序源码,对两个excel文件进行对比修复,并转移保存源码。
  • Excel对比重复项

    2021-08-17 16:19:33
    《开始》>《条件格式》>《突出显示单元格规则》>《重复项》 效果图 同样的,也可以把要的数据复制到总表里,然后进行重复项
  • Excel宏应用,个人自用数据对比工具,纯Excel宏开发,代码公开,欢迎使用下载。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,309
精华内容 15,323
关键字:

EXCEL对比