excel文件合并小工具


前言

写这个小工具的原因是因为在工作中需要将两个excel里面的数据合并一个新的文件,起初尝试通过WPS进行合并,但是奈何WPS需要收费,所以就自己动手写一个,说干就干,于是乎就有了这个用python写的小工具


一、基本思路

通过excel文件的路径,读取每个文件当前活跃表格的标题,创建一个新的文件 “合并内容.xlsx” 文件,将要合并的两个文件的标题写入到新创建的文件中,当然重复的标题也会自动过滤的,然后将第一个文件的列标题和新创建的文件的列标题进行对比,如果存在新创建的文件中,然后通过迭代,将整列数据都写入到新创建的文件中,然后通过计算出新创建的文件的行数,在进行第二个文件的写入,步骤同第一个文件的写入一样
采用python的tkiner框架编写,界面简单,操作方便,可以将具有不同列名的两个excel表格文件 合并到一个新的excel文件中

二、编码实现

具体的代码实现如下,代码格式上,大家可以自己调整,也可以在原有的基础上进行添加新的功能:

from openpyxl import load_workbook
from openpyxl import Workbook
from tkinter import *
from tkinter import filedialog
import tkinter.messagebox

#获取文件1的路径
def upload_file1(file1_entry):
    select_file1 = tkinter.filedialog.askopenfilename()
    file1_entry.insert(0,select_file1)
#获取文件2的路径
def upload_file2(file2_entry):
    select_file2 = tkinter.filedialog.askopenfilename()
    file2_entry.insert(0,select_file2)

def merge_file(result_text,file1_path,file2_path):
    result_text.insert('end',"开始合并\n")
    try:
        # 读取excel文件
        excel_file1 = load_workbook(filename=file1_path)
        excel_file2 = load_workbook(filename=file2_path)
        write_excel_file = Workbook()
        sheet1 = excel_file1.active
        sheet2 = excel_file2.active
        ac_write_excel_obj = write_excel_file.active
        result_text.insert('end', "合并中........\n")
        write_excel_file_title_list = []
        column_title_not_in_write_list = []
        file1_title = []
        file2_title = []
        # 获取excel1的标题
        for title_index in range(1, sheet1.max_column + 1):
            file1_title.append(sheet1.cell(row=1, column=title_index).value)
        # 获取excel2的标题
        for title_index2 in range(1, sheet2.max_column + 1):
            file2_title.append(sheet2.cell(row=1, column=title_index2).value)
        # 判断列名是否存在合并的新文件中
        flag = False
        # 将合并单元格的标题写入合并文件中
        for title_index in range(1, sheet1.max_column + 1):
            ac_write_excel_obj.cell(row=1, column=title_index).value = sheet1.cell(row=1, column=title_index).value
        # 读取要写入文件的列数
        write_max_column_num = ac_write_excel_obj.max_column
        # 将合并新文件中的列名写入到列表中暂存
        for write_file_title_index in range(1, write_max_column_num + 1):
            write_excel_file_title_list.append(ac_write_excel_obj.cell(row=1, column=write_file_title_index).value)
        # 读取合并文件2中不存在合并文件中的列标题
        for title2_index in range(1, sheet2.max_column + 1):
            sheet2_title_name = sheet2.cell(row=1, column=title2_index).value
            for write_title_name in write_excel_file_title_list:
                if write_title_name == sheet2_title_name:
                    flag = True
                    break
            if not flag:
                column_title_not_in_write_list.append(sheet2_title_name)
            else:
                flag = False
        # 将不存在与合并新文件中的列名写入到合并的新文件中
        for write_index in range(write_max_column_num + 1,
                                 write_max_column_num + int(len(column_title_not_in_write_list)) + 1):
            ac_write_excel_obj.cell(row=1, column=write_index).value = column_title_not_in_write_list.pop()
        # 获取第二次的合并新文件的全部列名
        write_excel_file_title_list = []
        for now_write_title_index in range(1, ac_write_excel_obj.max_column + 1):
            write_excel_file_title_list.append(ac_write_excel_obj.cell(row=1, column=now_write_title_index).value)
        # 将文件1的内容写入到合并的新文件中
        for index, item in enumerate(file1_title):
            file1_title_in_write_column_index = write_excel_file_title_list.index(item)
            for row in range(2, sheet1.max_row + 1):
                ac_write_excel_obj.cell(row=row, column=file1_title_in_write_column_index + 1).value = sheet1.cell(
                    row=row,
                    column=index + 1).value

        # 定义存储file2每一列的内容的暂存列表
        file2_buffer_list = []
        # 获取目前合并文件的最大行数
        now_max_row_number = ac_write_excel_obj.max_row
        for index, item in enumerate(file2_title):
            file2_title_in_write_column_index = write_excel_file_title_list.index(item)
            # 将本列的数据暂存在暂存列表中
            for shuju_row in range(2, sheet2.max_row + 1):
                file2_buffer_list.append(sheet2.cell(row=shuju_row, column=(index + 1)).value)
            print(file2_buffer_list)
            for row in range(now_max_row_number + 1, ((now_max_row_number + sheet2.max_row - 1) + 1)):
                ac_write_excel_obj.cell(row=row,
                                        column=(file2_title_in_write_column_index + 1)).value = file2_buffer_list.pop()

        write_excel_file.save("合并内容.xlsx")
        tkinter.messagebox.showinfo("成功信息", "合并成功,文件名 合并内容.xlsx")
        result_text.insert("end", "合并成功,关闭软件之后,文件才会出现\n")
    except:
        tkinter.messagebox.showinfo("错误信息","合并异常")
        result_text.insert("end","请检查文件路径或者文件格式是否正确\n")

if __name__ == '__main__':
    root = Tk()
    root.geometry("600x600+300+80")
    tip_information = Label(root,justify="center",padx="10",pady="10",text="请上传xlsx后缀名文件,否则会出错").place(x=100,y=30,width=200,height=50)
    file1_upload_btn = Button(root, justify="center", padx="10", pady="10", text="文件1", width="100", height="50",
                              command=lambda: upload_file1(file1_entry))
    file1_upload_btn.place(x=100, y=100, width=100, height=50)
    file1_entry = Entry(root, justify="center", width=180, relief="groove")
    file1_entry.place(x=210, y=100, width=180, height=50)
    file2_upload_btn = Button(root, justify="center", padx="10", pady="10", text="文件2", width="100", height="50",
                              command=lambda: upload_file2(file2_entry))
    file2_upload_btn.place(x=100, y=160, width=100, height=50)
    file2_entry = Entry(root, justify="center", width=180, relief="groove")
    file2_entry.place(x=210, y=160, width=180, height=50)
    result_Text = Text(root, width=300, height=300)
    result_Text.place(x=100, y=290, width=300, height=300)
    start_upload_file_btn = Button(root, justify="center", padx="10", pady="10", text="开始上传", width="100", height="50",
                                   command=lambda: merge_file(result_Text, file1_entry.get(), file2_entry.get()))
    start_upload_file_btn.place(x=100, y=220, width=100, height=50)
    root.mainloop()

三、使用测试

界面如图所示

在这里插入图片描述

功能测试

点击文件1按钮,选择文件1,点击文件2,选择文件2,然后点击开始上传,等待一会就会出现结果,如果成功的话,就会出现,合并成功,合并的文件名为 ’合并内容.xlsx’ ,在小工具的同目录底下就可以看见一个最终合并的文件,也是一个excel文件,双机打开,就可以查看合并后的内容了,但是小工具的特点就是在合并的过程中,会将第二个文件的列名颠倒,是因为在程序代码编写中,使用了列表的pop方法,从尾部开始将列名弹出栈,所以导致了这样的效果,同时,第二个文件的内容也会颠倒添加到新创建的文件中,原因也是因为pop方法的使用,如果上传的文件错误,就会提示出文件异常的弹框,会提示你检查文件的格式或者文件的路径,如果你想二次上传文件1或者文件2,请把当前文件1或者文件2后面的文本框内的路径删除之后,在进行上传,否则就会两个路径合并到一起,出现在文本框中,导致最终的文件读取错误,导致合并文件失败
在这里插入图片描述