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("没有选择文件夹")

作者 zcc0029

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注