Python3实现两个Excel文件内容比对

最近在工作中,需要人工比对大量的excel格式报表,刚好刚学了Pyhon入门基础知识,想着写个东西练练手,不但能提高代码编写能力,还能减轻工作量,提高工作效率。说干就干,简单的理了逻辑。首先,将目标表和源表的内容分别写入到字典中,Excel表中不确定有没有字段是唯一值,所以选择了行号作为key值,一行的内容放到list中,然后从源表中取一行去目标表中遍历。想好之后开始敲代码了,在代码编写过程中遇到很多的问题,都是遇到一个查一个。基本的比对功能实现后,就想着在加个日志记录下比对结果。写下此文记录下,just do it.
下面是全部代码

#-*- coding: utf-8 -*-

#比对两个Excel文件内容的差异
#---------------------假设条件----------------
#1、源表和目标表格式一致
#2、不存在合并单元格
#3、第2行开始比对
#---------------------------------------------

import xlrd
import xlwt
import os
import time;  # 引入time模块

#往日志文件中追加内容函数
def writeappend_logfile(filename,content):
    file=open(filename,‘a‘) #以追加方式打开日志文件
    time_now= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  #系统时间格式化
    file.writelines(time_now+‘:‘+content+‘\n‘)      #写入内容
    file.close() #关闭文件

def read_excel(ori_path,tar_path,sub_name):#
    success=0        #匹配一致数量
    fail=0           #匹配不一致数量
    origin_xls={} #存储源xls文件
    target_xls={} #比对的xls文件
    wb_ori=xlrd.open_workbook(ori_path) #打开原始文件
    wb_tar=xlrd.open_workbook(tar_path) #打开目标文件
    sheet_num = len(wb_ori.sheets()) #源表子表数量
##    for sheet_i in range(sheet_num):  #excel中子页面数量
##        sheet_ori=wb_ori.sheet_by_index(sheet_i) #通过索引值获取源表名
##        sheet_tar=wb_tar.sheet_by_index(sheet_i) #通过索引值获取源表名

    startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())    #获取系统当前时间并格式化为格式
    print (startime,‘ 开始比对...‘)
    logname=‘log_‘+startime[0:10]+‘.log‘               #截取日期年月日构成日志文件名

    logfile=open(logname,‘w‘)    #创建日志文件,如果文件存在则清空内容,不存在则创建,如果需要同时批量比对多张表,可以考虑将日志文件名作为参数传入
    logfile.writelines(startime+‘:【开始比对】...‘+‘\n‘)       #写入开始时间
    logfile.close()            #关闭日志文件

    try:
        sheet_ori=wb_ori.sheet_by_name(sub_name)
        sheet_tar=wb_tar.sheet_by_name(sub_name)
        if sheet_ori.name==sheet_tar.name:
            #sheet表名
            if sheet_ori.name==sub_name:
            #先将数存入dictionary中dictionary(rows:list)
            #第一行存储表头
            #源表取一行数据与目标表全表进行比对如果表中存在主键可以用主键进行索引
            #数据从excel第3行开始
                for rows in range(1,sheet_ori.nrows):
                    orign_list=sheet_ori.row_values(rows) #源表i行数据
                    target_list=sheet_tar.row_values(rows) #目标表i行数据
                    origin_xls[rows]=orign_list     #源表写入字典
                    target_xls[rows]=target_list    #目标表写入字典

                if origin_xls[1]  == target_xls[1]:
                    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘ 表头一致‘)
                for ori_num in origin_xls:
                    flag=‘false‘          #判断是否一致标志
                    for tar_num in target_xls:
                        if origin_xls[ori_num]==target_xls[tar_num]:
                            flag=‘true‘
                            break              #如果匹配到结果退出循环
                    if flag==‘true‘:           #匹配上结果输出后台日志
                        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘ row:%d is ok‘%ori_num)
                        success+=1
                    else:                      #匹配不上将源表中行记录写入txt
                        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘ row:%d is different‘%ori_num)
                        fail+=1
                        data=origin_xls[ori_num]
                        logstr=‘【不一致】row<‘+str(ori_num)+‘>:‘+str(data)
                        writeappend_logfile(logname,logstr)
               # logstr=‘【比对完成】总记录数:‘+str(ori_num)+‘条,一致:‘+str(success)+‘条,不一致:‘+str(fail)+‘条‘
                logstr=‘【比对完成】总记录数:{:d}条,一致:{:d}条,不一致:{:d}条‘.format(ori_num,success,fail)
                print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘ 【%s】比对结束‘%sheet_ori.name)
                print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘ 总记录数:%d条,一致:%d条,不一致:%d条‘%(ori_num,success,fail))
                writeappend_logfile(logname,logstr)

        else:
            errmsg=‘【‘+sub_name+‘】子表名不一致‘
            writeappend_logfile(logname,errmsg)
    except Exception as err:
       writeappend_logfile(logname,str(err)) #输出异常

def main():
    pass

if __name__ == ‘__main__‘:

    read_excel(r‘2.xls‘,1.xls‘,‘sheet1‘)

原文地址:http://blog.51cto.com/13777112/2135708

时间: 2024-08-27 09:24:36

Python3实现两个Excel文件内容比对的相关文章

PHP读取Excel文件内容

PHP读取Excel文件内容 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel. PHPExcelReader比较轻量级,仅支持Excel的读取,实际上就是一个Reader.但是可惜的是不能够支持Excel 2007的格式(.xlsx). PHPExcel比较强大,能够将内存中的数据输出成Excel文件,同时还能够对Excel做各种操作,下面主要介绍下如何使用PHPExcel进行Excel 2007格式(.xlsx)文

c#用NPOI将excel文件内容读取到datatable数据表中

将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable 1 /// <summary> 2 /// 将excel文件内容读取到DataTable数据表中 3 /// </summary> 4 /// <param name="fileName">文件完整路径名</param> 5 /// <param name=

Java编程:使用Java读取Excel文件内容

微软的ODBC驱动程序把工作表中的第一行作为列名(译者注:即字段名),工作表名作为数据库表名. 要通过JDBC访问工作表,我们还必须创建一个新的ODBC数据源,在Windows 2000系统上创建数据源的过程如下: 进入“控制面板” --> “管理工具” --> “数据源(ODBC)”,(译者注:打开后选择系统DSN),点击添加,在弹出窗口中选择“Driver do Microsoft Excel(*.xls)” 然后在数据源名处输入一个名字myexcel(译者注:相当于数据库名),然后点击“

将Excel文件内容拖拽至ExtJs的Panl

参考地址:http://loianegroner.com/2010/03/importing-an-excel-spreadsheet-into-an-extjs-datagrid-using-datadrop-grid-plugin/ 演示例子:https://github.com/loiane/extjs-grid-dragdrop-excel 将Excel文件内容拖拽至ExtJs的Panl,布布扣,bubuko.com

读取Excel文件内容在Web上显示

点击事件代码.cs protected void Button1_Click(object sender, EventArgs e) { string strPath = "d:/test.xls"; string mystring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = '" + strPath + "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=

比对两个Word文件内容是否一致的C#解决办法

using System; using System.Windows.Forms; using System.Diagnostics; using Microsoft.Office.Interop.Word; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(obj

将excel文件内容存储到数据库,并可以实时在前端查看(不必生成文件)

版权声明:本文为博主原创文章,未经博主允许不得转载 本文主要讲前端内容,后端涉及较少,可以认为是使用Java. 首先是excel文件上传,这个较为简单,可以html5的数据接口FormData()进行操作.具体代码如下: <!DOCTYPE html> <html> <head> </head> <body> <input type="file" id="_file" value="&quo

关于jquery读取excel文件内容 xls xlsx格式

在一个项目中需要读取excel的内容,当然excel是有格式的,格式就是读取到的第一行会作为属性(Title) 例如如下excel Language Detil en English cn Chinese jp Japanese 该excel会解析成:方式1 当然也可以解析成:方式2 ///////////////////////////////////////////////////////////////////////////////////////////////////////////

批量读取excel文件内容代码

最近工作需要批量添加映射excel文件字段的代码  于是通过读取excel2007实现了批量生成代码,记录下代码 需要引入poi的jar包 import java.awt.List; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import org.apache.poi