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后面的文本框内的路径删除之后,在进行上传,否则就会两个路径合并到一起,出现在文本框中,导致最终的文件读取错误,导致合并文件失败