import pandas as pd
import os
from tkinter import Tk
from tkinter.filedialog import askdirectory
from openpyxl import Workbook
def select_folder():
"""弹出对话框让用户选择文件夹,并返回文件夹路径"""
Tk().withdraw() # 不显示根窗口
folder_selected = askdirectory()
return folder_selected
def merge_excel_files_without_alignment(folder_path):
"""直接合并指定文件夹下的所有Excel文件(xls和xlsx)的数据到一个新的Excel文件中,不考虑列名和列数的对齐"""
excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xls', '.xlsx'))]
output_file = os.path.join(folder_path, 'merged_simple.xlsx')
# 创建一个新的Excel工作簿
wb = Workbook()
ws = wb.active
for file in excel_files:
file_path = os.path.join(folder_path, file)
# 读取Excel文件的所有工作表
xls = pd.ExcelFile(file_path)
for sheet_name in xls.sheet_names:
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 将DataFrame的数据追加到工作簿中
for r in dataframe_to_rows(df, index=False, header=True):
ws.append(r)
# 保存新的Excel文件
wb.save(output_file)
print(f"合并完成,文件已保存到:{output_file}")
def dataframe_to_rows(df, index, header):
"""将DataFrame转换为行的生成器,可用于追加到openpyxl工作表中"""
import numpy as np
# Header
if header:
yield df.columns.tolist()
# Values
for row in df.itertuples(index=index, name=None):
yield [cell if pd.notnull(cell) else None for cell in row]
folder_path = select_folder()
if folder_path:
merge_excel_files_without_alignment(folder_path)
else:
print("没有选择文件夹")