最近有小伙伴说需要一个工具,用来对比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: kplinimport pandas as pd
import osdef 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'%imy_log(info)return Noneif 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_listdf2['Compare Result'] = dis_listdf1.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,直接下载安装依赖包。

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

Python实现简单的excel对比工具相关推荐

  1. Python 自动化办公之 Excel 对比工具

    作者 | 周萝卜 来源丨萝卜大杂烩 今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 由于 ...

  2. Python自动化办公之Excel对比工具

    今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 由于工作当中经常需要对比前后两个 Exc ...

  3. python怎么筛选excel数据_python筛选数据excel表格-如何利用python提取两个excel对比后的重复值的信息?...

    怎么用python读取excel表格的数据 import xlrd #open the .xls file xlsname="test.xls" book = xlrd.open_ ...

  4. 用python进行简单的excel表格分析

    今天测试要对比新旧数据,然后添加新增数据,叫我帮忙弄.我靠几千条数据怎么可能一条条筛选.就打算试试用python弄一下,对比java的poi进行的excel处理的确简单好多.很快就上手了. 1,导入包 ...

  5. python制作软件excel,利用Python制作Excel对比工具

    目前功能还不完善,只能对比第一个sheet的内容,代码如下: # -*- coding: utf-8 -*- # 博客园 C丶小明 import xlrd,time from docx import ...

  6. 求助:利用Python制作Excel对比工具

    需求:excel的内容是关于人员的项目成绩信息.每个excel中的项目成绩格式一致,人数可能不一致.选择任意两个excel文件,通过A列的姓名,匹配预设规则1或2,比较每个人在两个excel中各个项目 ...

  7. 史上最简单的excel处理工具(01)

    遇到个需求需要将部分数据导入到数据库,调研已经将数据整理成excel表格了,于是果断选择从excel读取数据,处理数据后,然后入库. 在开源中国溜达了一番,找到个MyExcel工具,使用简单,功能强大 ...

  8. 「starter推荐」简单高效 Excel 导出工具

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:冷冷gg 链接:https://jue ...

  9. python xlrd简单读取excel

    1 import xlrd 2 #打开文件 3 book = xlrd.open_workbook ('Status.xlsx') 4 #获取数据表 5 table1 = book.sheets()[ ...

  10. python数据标注工具_python实现简单图片物体标注工具

    本文实例为大家分享了python实现简单图片物体标注工具的具体代码,供大家参考,具体内容如下 # coding: utf-8 """ 物体检测标注小工具 基本思路: 对要 ...

最新文章

  1. leetcode Reverse Linked List
  2. Linq to XML 基本类
  3. 用页传值方式解决模态窗口的Response.WriteFile文件下载
  4. Apache https服务器配置笔记
  5. Lingoes 2.8 手动去广告步骤
  6. CONFIGURE CONTROLFILE AUTOBACKUP ON/OFF;
  7. Taro+react开发(58) toHtml
  8. oracle 01589,ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
  9. (36)System Verilog类中方法示例
  10. ssms安装_SQLServer 2019下载及安装教程
  11. Effective Objective-C 2.0 Tips 总结 Chapter 3 Chapter 4
  12. apache下虚拟域名配置
  13. JavaScript 函数看代码写结果
  14. nRF52840(一) 环境搭建
  15. 32怎么通过一个按键实现不同工作模式_罗技G604鼠标为设计师而生,15个可编程按键玩转Adobe软件!...
  16. 【暑期每日一题】洛谷 P6437 [COCI2011-2012#6] JACK
  17. 测试计划和测试方案的本质区别
  18. 戴尔笔记本耳机插着没反应?
  19. fabric8镜像的deployments脚本
  20. html百度天气查询api,百度提供天气预报查询接口API

热门文章

  1. Lammps之循环定压比热熔计算
  2. 按住滑块 拖拽验证html5,【原生】JavaScript 实现滑动拖动验证
  3. 电阻阻值标准以及选择参照表
  4. c语言自行车租赁系统,winform 自行车租赁系统(含数据库)
  5. Sigmoid 函数
  6. java网络电话_基于Java的网络电话系统设计与实现.pdf
  7. 怎么认识自己--《思辩与立场:生活中无处不在的批判性思维工具》
  8. java番茄钟_番茄时间管理 - java Swing版
  9. html5轮播图代码效果图,JavaScript实现轮播图效果代码实例
  10. 抽奖活动mysql表设计_抽奖项目的系统设计方案