Python 将多个DataFrame合并到一个Excel工作表的sheet中有几种方法

 

在Python中,将多个DataFrame合并到一个Excel工作表的sheet中有几种方法。以下是常见的几种实现方式:

方法1:直接合并DataFrame后保存

import pandas as pd

# 示例数据
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})

# 方法1.1:纵向合并(行合并)
result = pd.concat([df1, df2, df3], axis=0)  # axis=0 按行合并
result.to_excel('merged_vertical.xlsx', index=False, sheet_name='Merged_Data')

# 方法1.2:横向合并(列合并)
result = pd.concat([df1, df2, df3], axis=1)  # axis=1 按列合并
result.to_excel('merged_horizontal.xlsx', index=False, sheet_name='Merged_Data')

实践:

image

merged_vertical.xlsx 文件:

image

 

merged_horizontal.xlsx文件:

image

 

 

方法2:使用ExcelWriter进行更灵活的控制

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 示例数据
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})

# 创建一个新的Excel文件
with pd.ExcelWriter('merged_data.xlsx', engine='openpyxl') as writer:
    # 先写入第一个DataFrame
    df1.to_excel(writer, sheet_name='Combined', index=False, startrow=0)
    
    # 获取当前工作表
    workbook = writer.book
    worksheet = writer.sheets['Combined']
    
    # 计算下一个DataFrame的起始位置
    start_row = len(df1) + 2  # +2是为了在DataFrame之间留一个空行
    
    # 写入第二个DataFrame
    df2.to_excel(writer, sheet_name='Combined', index=False, startrow=start_row)
    
    # 更新起始位置
    start_row += len(df2) + 2
    
    # 写入第三个DataFrame
    df3.to_excel(writer, sheet_name='Combined', index=False, startrow=start_row)

方法3:使用openpyxl直接操作

import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

def merge_dataframes_to_sheet(dataframes, filename, sheet_name='Merged_Data'):
    """
    将多个DataFrame合并到一个Excel工作表中
    
    Parameters:
    dataframes: list of DataFrames - 要合并的DataFrame列表
    filename: str - 输出文件名
    sheet_name: str - 工作表名称
    """
    # 创建工作簿和工作表
    wb = Workbook()
    ws = wb.active
    ws.title = sheet_name
    
    current_row = 1
    
    for i, df in enumerate(dataframes):
        # 添加DataFrame名称作为标题(可选)
        if hasattr(df, 'name') and df.name:
            ws.cell(row=current_row, column=1, value=f"DataFrame: {df.name}")
            current_row += 1
        
        # 写入DataFrame数据
        for r in dataframe_to_rows(df, index=False, header=True):
            for c, value in enumerate(r, 1):
                ws.cell(row=current_row, column=c, value=value)
            current_row += 1
        
        # 在DataFrame之间添加空行(除了最后一个)
        if i < len(dataframes) - 1:
            current_row += 1
    
    # 保存文件
    wb.save(filename)

# 使用示例
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})

merge_dataframes_to_sheet([df1, df2, df3], 'merged_dataframes.xlsx')

方法4:更高级的合并函数

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

def advanced_merge_to_sheet(dataframes, filename, sheet_name='Merged_Data', 
                           add_titles=True, spacing=1):
    """
    高级合并函数,支持更多自定义选项
    
    Parameters:
    dataframes: list of DataFrames - 要合并的DataFrame列表
    filename: str - 输出文件名
    sheet_name: str - 工作表名称
    add_titles: bool - 是否添加DataFrame标题
    spacing: int - DataFrame之间的空行数
    """
    wb = Workbook()
    ws = wb.active
    ws.title = sheet_name
    
    current_row = 1
    
    for i, df in enumerate(dataframes):
        # 添加标题
        if add_titles:
            title_cell = ws.cell(row=current_row, column=1, 
                               value=f"DataFrame {i+1}")
            title_cell.font = Font(bold=True, size=12)
            title_cell.alignment = Alignment(horizontal='left')
            current_row += 1
        
        # 写入表头
        header_row = list(df.columns)
        for col_idx, header in enumerate(header_row, 1):
            cell = ws.cell(row=current_row, column=col_idx, value=header)
            cell.font = Font(bold=True)
        
        current_row += 1
        
        # 写入数据
        for _, row in df.iterrows():
            for col_idx, value in enumerate(row, 1):
                ws.cell(row=current_row, column=col_idx, value=value)
            current_row += 1
        
        # 添加间距
        if i < len(dataframes) - 1:
            current_row += spacing
    
    # 自动调整列宽
    for column in ws.columns:
        max_length = 0
        column_letter = column[0].column_letter
        for cell in column:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(str(cell.value))
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column_letter].width = adjusted_width
    
    wb.save(filename)

# 使用示例
df1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35]})
df2 = pd.DataFrame({'城市': ['北京', '上海', '广州'], '工资': [10000, 12000, 9000]})
df3 = pd.DataFrame({'部门': ['技术部', '销售部', '人事部'], '工龄': [3, 5, 2]})

advanced_merge_to_sheet([df1, df2, df3], 'advanced_merged.xlsx', 
                       add_titles=True, spacing=2)

方法5:使用xlsxwriter引擎

import pandas as pd

def merge_with_xlsxwriter(dataframes, filename, sheet_name='Merged_Data'):
    """
    使用xlsxwriter引擎合并DataFrame
    """
    with pd.ExcelWriter(filename, engine='xlsxwriter') as writer:
        workbook = writer.book
        worksheet = workbook.add_worksheet(sheet_name)
        
        start_row = 0
        
        for i, df in enumerate(dataframes):
            # 写入DataFrame
            df.to_excel(writer, sheet_name=sheet_name, 
                       startrow=start_row, index=False)
            
            # 更新起始行位置
            start_row += len(df) + 2  # +2 用于表头和空行

# 使用示例
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})

merge_with_xlsxwriter([df1, df2], 'xlsxwriter_merged.xlsx')

水平合并,xlsxwriter_merged.xlsx 文件结果:

image

 

纵向合并:

def merge_with_xlsxwriter(dataframes, filename, sheet_name='Merged_Data'):
    """
    使用xlsxwriter引擎合并DataFrame
    """
    with pd.ExcelWriter(filename, engine='xlsxwriter') as writer:
        workbook = writer.book
        worksheet = workbook.add_worksheet(sheet_name)
        start_col = 0
        for i, df in enumerate(dataframes):
            # 写入DataFrame
            df.to_excel(writer, sheet_name=sheet_name, startcol=start_col, index=False)

            start_col += len(df.columns) + 1  # 获取列数,中间空1列,更新起始列位置
            
# 使用示例
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})

merge_with_xlsxwriter([df1, df2], 'xlsxwriter_merged.xlsx')

运行结果:

image

  

 

 

选择哪种方法取决于你的具体需求:

  • 方法1:适合简单的行或列合并

  • 方法2:适合需要精确控制位置的情况

  • 方法3:提供最大的灵活性

  • 方法4:适合需要格式化的专业输出

  • 方法5:适合使用xlsxwriter的高级功能

根据你的具体需求选择最合适的方法即可。

 

 

 

posted @ 2025-10-17 09:01  行走的思想  阅读(14)  评论(0)    收藏  举报