首页 > 编程语言 >使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件

使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件

时间:2024-09-18 20:22:11浏览次数:9  
标签:文件 Python excel Excel number content tk file diff

因为有统计成员到会情况的任务,每次汇总时都很麻烦,需要一个个对应腾讯会议导出名单的成员,然后在总表上进行标记,所以就写了本程序来减少统计的复杂度。

使用xlrdxlwt包 首先安装两个包

pip install xlrd == 1.2.0
pip install xlwt == 0.7.5

定义contrast函数

def contrast(processed_export_excel_file,all_number_file,different_name_file):
    """
    @param processed_export_excel_file:处理后的导出名单
    @param all_number_file:总人数的名单
    @param different_name_file:导出文件的地址
    """
    # 打开Excel文件
     # 打开处理后的导出名单
    data1 = xlrd.open_workbook(processed_export_excel_file)
    # 打开总人数的名单
    data2 = xlrd.open_workbook(all_number_file)
    # 获取第一个sheet
    sheet1 = data1.sheet_by_index(0)
    sheet2 = data2.sheet_by_index(0)
    #  获取两个Excel文件的行数和列数
    grows1 = sheet1.nrows
    grows2 = sheet2.nrows
    # 创建一个新的Excel文件
    new_excel = xlwt.Workbook()
    new_sheet = new_excel.add_sheet('未参会人员')
    # 相同项
    same_content = []
    # sheet2中的所有人员
    excel_2_content = []
    # 未参会人员
    diff_content = []
    for i in range(grows2):
        excel_2_content.append(sheet2.cell_value(i, 0))
    for i in range(grows1):
        for j in range(grows2):
            sheet1_value = sheet1.cell_value(i, 0)
            sheet2_value = sheet2.cell_value(j, 0)
            # sheet1的字符串包含sheet2的字符串
            if str(sheet2_value) in str(sheet1_value):
                same_content.append(sheet2_value)
    # 找出excel_2_content中不在same_content中的内容
    for i in excel_2_content:
        if i not in same_content:
            diff_content.append(i)
    print("原有内容:", excel_2_content)
    print("相同项:" + str(same_content))
    print("不同项:" + str(diff_content))
    print("总共有" + str(len(diff_content)) + "个不同项")

    # 将不同项写入新的Excel文件
    for i in range(len(diff_content)):
        new_sheet.write(i, 0, diff_content[i])
    new_excel.save(different_name_file)

测试contrast函数

if __name__ == '__main__':
    file1 = r"C:/Users/MSI/Desktop/test1.xlsx"
    file2 = r"C:/Users/MSI/Desktop/test2.xlsx"
    outfile = r"C:/Users/MSI/Desktop/diff.xlsx"
    contrast(file1, file2, outfile)

完整代码:

import xlrd
import xlwt

"""
pip3 install xlrd == 1.2.0
pip3 install xlwt == 0.7.5
"""


def contrast(processed_export_excel_file, all_number_file, different_name_file):
    """
    @param processed_export_excel_file: 导出名单处理后
    @param all_number_file: 总人数的名单
    @param different_name_file: 导出文件名
    """
    # 打开Excel文件
    # 打开处理后的导出名单
    data1 = xlrd.open_workbook(processed_export_excel_file)
    # 打开总人数的名单
    data2 = xlrd.open_workbook(all_number_file)
    # 获取第一个sheet
    sheet1 = data1.sheet_by_index(0)
    sheet2 = data2.sheet_by_index(0)
    #  获取两个Excel文件的行数和列数
    grows1 = sheet1.nrows
    grows2 = sheet2.nrows
    # 创建一个新的Excel文件
    new_excel = xlwt.Workbook()
    new_sheet = new_excel.add_sheet('未参会人员')
    # 相同项
    same_content = []
    # sheet2中的所有人员
    excel_2_content = []
    # 未参会人员
    diff_content = []
    for i in range(grows2):
        excel_2_content.append(sheet2.cell_value(i, 0))
    for i in range(grows1):
        for j in range(grows2):
            sheet1_value = sheet1.cell_value(i, 0)
            sheet2_value = sheet2.cell_value(j, 0)
            # sheet1的字符串包含sheet2的字符串
            if str(sheet2_value) in str(sheet1_value):
                same_content.append(sheet2_value)
    # 找出excel_2_content中不在same_content中的内容
    for i in excel_2_content:
        if i not in same_content:
            diff_content.append(i)
    print("原有内容:", excel_2_content)
    print("相同项:" + str(same_content))
    print("不同项:" + str(diff_content))
    print("总共有" + str(len(diff_content)) + "个不同项")

    # 将不同项写入新的Excel文件
    for i in range(len(diff_content)):
        new_sheet.write(i, 0, diff_content[i])
    new_excel.save(different_name_file)


if __name__ == '__main__':
    file1 = r"C:/Users/MSI/Desktop/test1.xlsx"
    file2 = r"C:/Users/MSI/Desktop/test2.xlsx"
    outfile = r"C:/Users/MSI/Desktop/diff.xlsx"
    contrast(file1, file2, outfile)

到这里,核心功能已经做出来了。但还不是很方便,每次都需要打开程序,重新输入Excel所在的路径。那就再加上一点细节,做个界面,把程序打包成exe文件吧。 下面是详细步骤:

安装tkinter包 pip install tkinter == 8.6.7

导入tkinter

import tkinter as tk
import tkinter.filedialog
from tkinter import *
from tkinter import messagebox

写个函数用来选择路径

def select_export_path():
    temp = tk.filedialog.askopenfilename()
    export_path.set(temp)


def select_all_number_path():
    temp = tk.filedialog.askopenfilename()
    all_number_Path.set(temp)


def select_diff_path():
    temp = tk.filedialog.askopenfilename()
    diff_path.set(temp)

初始化变量

root = tk.Tk()
export_path = StringVar()
all_number_Path = StringVar()
diff_path = StringVar()

画出UI界面

def ui():
    """
   选择界面设计以及路径功能
   """
    root.title("对比工具")
    root.geometry("400x200")
    # 标签
    tk.Label(root, text="导出参会成员名单:").grid(row=0, column=0)
    tk.Label(root, text="全部成员名单:").grid(row=1, column=0)
    tk.Label(root, text="未参会成员名单:").grid(row=2, column=0)
    # 输入框
    processed_export_excel_file = tk.Entry(root, textvariable=export_path)
    processed_export_excel_file.grid(row=0, column=1)
    all_number_file = tk.Entry(root, textvariable=all_number_Path)
    all_number_file.grid(row=1, column=1)
    different_name_file = tk.Entry(root, textvariable=diff_path)
    different_name_file.grid(row=2, column=1)
    # 按钮
    tk.Button(root, text="选择文件", command=select_export_path).grid(row=0, column=2)
    tk.Button(root, text="选择文件", command=select_all_number_path).grid(row=1, column=2)
    tk.Button(root, text="选择文件", command=select_diff_path).grid(row=2, column=2)
    tk.Button(root, text="开始对比",
              command=lambda: contrast_button_clicked(processed_export_excel_file.get(), all_number_file.get(),
                                                      different_name_file.get())).grid(row=3, column=1)

    root.mainloop()

点击对比按钮后的函数

def contrast_button_clicked(processed_export_excel_file, all_number_file, different_name_file):
    contrast_result, number = contrast(processed_export_excel_file, all_number_file, different_name_file)
    if contrast_result:
        tk.messagebox.showinfo("提示", "对比成功!共有"+str(number)+"人缺会,详细情况请到" + different_name_file + "文件查看")
    else:
        tk.messagebox.showinfo("提示", "对比失败!请检查输入路径是否正确")

接下来就是把这个py程序打包,使用pyinstaller这个包

pip install pyinstaller

安装成功之后,按键盘win+R打开运行,输入cmd,回车运行。

进入程序所在文件夹:

然后输入pyinstaller -F -w contrast.py --hidden-import=pandas._libs.tslibs.timedeltas

使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件_Python

成功之后便可在程序根目录dist文件夹里边便可看到封装好的exe文件。

完整代码如下:

import xlrd
import xlwt
import tkinter as tk
import tkinter.filedialog
from tkinter import *
from tkinter import messagebox

"""
pip3 install xlrd == 1.2.0
pip3 install xlwt == 0.7.5
pip3 install tkinter == 8.6.7
"""


def select_export_path():
    temp = tk.filedialog.askopenfilename()
    export_path.set(temp)


def select_all_number_path():
    temp = tk.filedialog.askopenfilename()
    all_number_Path.set(temp)


def select_diff_path():
    temp = tk.filedialog.askopenfilename()
    diff_path.set(temp)


root = tk.Tk()
export_path = StringVar()
all_number_Path = StringVar()
diff_path = StringVar()


def ui():
    """
   选择界面设计以及路径功能
   """
    root.title("对比工具")
    root.geometry("400x200")
    # 标签
    tk.Label(root, text="导出参会成员名单:").grid(row=0, column=0)
    tk.Label(root, text="全部成员名单:").grid(row=1, column=0)
    tk.Label(root, text="未参会成员名单:").grid(row=2, column=0)
    # 输入框
    processed_export_excel_file = tk.Entry(root, textvariable=export_path)
    processed_export_excel_file.grid(row=0, column=1)
    all_number_file = tk.Entry(root, textvariable=all_number_Path)
    all_number_file.grid(row=1, column=1)
    different_name_file = tk.Entry(root, textvariable=diff_path)
    different_name_file.grid(row=2, column=1)
    # 按钮
    tk.Button(root, text="选择文件", command=select_export_path).grid(row=0, column=2)
    tk.Button(root, text="选择文件", command=select_all_number_path).grid(row=1, column=2)
    tk.Button(root, text="选择文件", command=select_diff_path).grid(row=2, column=2)
    tk.Button(root, text="开始对比",
              command=lambda: contrast_button_clicked(processed_export_excel_file.get(), all_number_file.get(),
                                                      different_name_file.get())).grid(row=3, column=1)

    root.mainloop()


def contrast_button_clicked(processed_export_excel_file, all_number_file, different_name_file):
    contrast_result, number = contrast(processed_export_excel_file, all_number_file, different_name_file)
    if contrast_result:
        tk.messagebox.showinfo("提示", "对比成功!共有"+str(number)+"人缺会,详细情况请到" + different_name_file + "文件查看")
    else:
        tk.messagebox.showinfo("提示", "对比失败!请检查输入路径是否正确")


def contrast(processed_export_excel_file, all_number_file, different_name_file):
    """
    @param processed_export_excel_file: 导出名单处理后
    @param all_number_file: 总人数的名单
    @param different_name_file: 导出文件名
    """
    # 打开Excel文件
    # 打开处理后的导出名单
    global result
    data1 = xlrd.open_workbook(processed_export_excel_file)
    # 打开总人数的名单
    data2 = xlrd.open_workbook(all_number_file)
    # 获取第一个sheet
    sheet1 = data1.sheet_by_index(0)
    sheet2 = data2.sheet_by_index(0)
    #  获取两个Excel文件的行数和列数
    grows1 = sheet1.nrows
    grows2 = sheet2.nrows
    # 创建一个新的Excel文件
    new_excel = xlwt.Workbook()
    new_sheet = new_excel.add_sheet('未参会人员')
    # 相同项
    same_content = []
    # sheet2中的所有人员
    excel_2_content = []
    # 未参会人员
    diff_content = []
    for i in range(grows2):
        excel_2_content.append(sheet2.cell_value(i, 0))
    for i in range(grows1):
        for j in range(grows2):
            sheet1_value = sheet1.cell_value(i, 0)
            sheet2_value = sheet2.cell_value(j, 0)
            # sheet1的字符串包含sheet2的字符串
            if str(sheet2_value) in str(sheet1_value):
                same_content.append(sheet2_value)
    # 找出excel_2_content中不在same_content中的内容
    for i in excel_2_content:
        if i not in same_content:
            diff_content.append(i)
    print("原有内容:", excel_2_content)
    print("相同项:" + str(same_content))
    print("不同项:" + str(diff_content))
    print("总共有" + str(len(diff_content)) + "个不同项")

    # 将不同项写入新的Excel文件
    for i in range(len(diff_content)):
        new_sheet.write(i, 0, diff_content[i])
        result = True
    new_excel.save(different_name_file)
    return result, len(diff_content)


if __name__ == '__main__':
    ui()

标签:文件,Python,excel,Excel,number,content,tk,file,diff
From: https://blog.51cto.com/Laccoliths/12048407

相关文章

  • 构建自己的文生图工具:Python + Stable Diffusion + CUDA
    构建自己的文生图工具:Python+StableDiffusion+CUDA前言概述环境搭建安装PyTorch安装StableDiffusion编写Python代码结论结语前言  在这个数字化和人工智能飞速发展的时代,图像生成技术正逐渐成为现实。想象一下,只需输入几个关键词,计算机就能创造出一幅栩栩如......
  • python+flask计算机毕业设计民宿后台管理系统的设计与实现(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和消费者对个性化体验需求的日益增长,民宿作为一种新兴住宿方式,在全球范围内迅速崛起......
  • OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo
    前言  Osg需要打开模型文件,但是遇到显示动力学仿真的K模型文件,.k文件是一种描述材料属性的文件,比如密度、弹性模量等,该模型文件不是常规中间开放格式,无法直接支持,需要自定义解析并且重建三维模型。<br>Demo  实际非常流程,因为视频转gif导致部分看起来不行:      <......
  • 基于python+flask框架的基于Web的教学场所管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育信息化的不断深入,高校及各类教育机构对教学资源的管理需求日益增强,尤其是教学场所的合理安排与高效利用成为提升教学质量与效率的......
  • 基于python+flask框架的基于web的考研信息系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及与就业竞争的加剧,考研已成为众多大学生提升自我、追求更高学术层次的重要途径。然而,面对海量的考研信息、复杂的院校选......
  • 基于python+flask框架的基于Web的空巢老人服务系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,空巢老人群体日益庞大,成为社会关注的焦点。空巢老人因子女离家工作、求学等原因,常面临生活孤独、健......
  • Python 桌宠代码
    importtkinter#导入tkinterGUI库importos#导入os库用于文件路径操作importrandom#导入random库用于随机选择fromplatformimportsystem#导入系统模块以检测操作系统fromPILimportImage,ImageTk#导入Pillow库用于处理图像透明背景#定......
  • 基于JAVA文件传输的计算机毕设源码+论文
    摘  要Abstract引  言1技术简介1.1Java语言1.1.4分布性1.3Java中输入/输出流概念1.5JBuilder集成开发环境介绍2系统分析2.1可行性分析2.2开发工具2.3需求分析3系统详细设计3.1系统的主要功能摘 要随着计算机网络技术的飞速发展,客户/服务C/S(Client/......
  • 《黑神话:悟空》游戏闪退时弹窗“找不到DuiLib.dll”文件该怎么处理?黑神话悟空游戏崩溃
    当玩《黑神话:悟空》时,游戏闪退并弹窗显示“找不到DuiLib.dll”文件,让人十分无奈。可能需要重新安装相关的运行库,或者检查系统是否存在故障。您碰到过这种状况吗?知道该怎么有效解决吗?本篇将为大家带来的内容,感兴趣的小伙伴们一起来看看吧,希望能够帮助到大家。DuiLib.dll的功能......
  • 《燧石枪:黎明之围》游戏闪退黑屏提示“找不到mfplat.dll”文件该怎么处理?燧石枪黎明之
    在体验《燧石枪:黎明之围》时,游戏闪退黑屏,还提示“找不到mfplat.dll”文件,这让人很是苦恼。解决办法或许是重新安装相关组件,或者从可靠来源获取该文件放到指定位置。您遇到过这种情况吗?知道如何处理吗?本篇将为大家带来《燧石枪:黎明之围》游戏闪退黑屏提示“找不到mfplat.dll”文......