将多个sheet合并成一个sheet导出,将多个dataframe导出至多个sheet

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 20 13:02:27 2020

@author: twx253
"""

import xlrd
import pandas as pd
from  pandas import DataFrame
from openpyxl import load_workbook

excel_name = 'C:/Users/twx253/Desktop/many_sheets.xlsx'  
wb = xlrd.open_workbook(excel_name)
sheets = wb.sheet_names() # 获取workbook中所有的表格
# 循环遍历所有sheet
alldata = DataFrame()
for i in range(len(sheets)):
    df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
    print(df.shape)
    alldata = alldata.append(df)
    
#指定合并后的数据放在哪个excel里
writer = pd.ExcelWriter('C:/Users/twx253/Desktop/many_sheets.xlsx',engine='openpyxl') 
book = load_workbook(writer.path)
writer.book = book

#指定合并后的数据放在哪个sheet里
alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA",index=False)
writer.save()
writer.close()
print('处理完成

当然可以!你提到的问题是: > 导出的文件能不能把所有数据都放在一个表格的一个 Sheet 中? 是的,**可以**。默认情况下,我们通常会把多个 DataFrame 写入 Excel 文件的不同 sheet 中。但如果你希望将多个 DataFrame **合并一个**,然后导出到 **同一个 sheet** 中,也是完全可行的。 --- ## ✅ 示例:将多个 DataFrame 合并一个 Sheet 中 ### ✅ 情景说明 你有多个用户的数据(DataFrame),希望将它们合并一个大表,并导出到同一个 Excel Sheet 中。 --- ## ✅ 修改后的 Python 示例代码 ```python import oracledb import pandas as pd import json # 读取配置文件 def load_config(config_file): with open(config_file, 'r') as f: return json.load(f) # 查询指定用户下的某张表数据(带查询条件) def query_table(conn_info, user, table_name, where_clause=None): try: conn = oracledb.connect( user=conn_info['user'], password=conn_info['password'], host=conn_info['host'], port=conn_info['port'], service_name=conn_info['service_name'] ) cursor = conn.cursor() sql = f"SELECT * FROM {user}.{table_name}" if where_clause: sql += f" WHERE {where_clause}" print(f"Executing SQL: {sql}") cursor.execute(sql) columns = [desc[0] for desc in cursor.description] data = cursor.fetchall() df = pd.DataFrame(data, columns=columns) cursor.close() conn.close() return df except oracledb.DatabaseError as e: error, = e.args if error.code == 942: print(f"⚠️ Table {table_name} does not exist in schema {user}, skipping...") return pd.DataFrame() else: print(f"❌ Error querying table {table_name} for user {user}: {e}") return pd.DataFrame() # 导出多个 DataFrame 到 Excel 的同一个 sheet def export_to_single_sheet(dataframes, output_file, sheet_name='CombinedData'): # 合并所有非空 DataFrame combined_df = pd.concat(dataframes, ignore_index=True) # 导出到 Excel 的一个 sheet combined_df.to_excel(output_file, sheet_name=sheet_name[:31], index=False) print(f"✅ Exported all data to {output_file} in sheet '{sheet_name}'") # 主函数 def main(): config = load_config("config.json") table_name = "YOUR_TABLE_NAME" output_file = "output_combined.xlsx" # 在程序中定义不同数据库的查询条件 where_conditions = { "oracle1": "status = 'ACTIVE' AND create_date > '2024-01-01'", "oracle2": "type = 'INVOICE' AND amount > 1000" } all_data = [] # 显式循环两个数据库链接 for db_name, conn_info in config.items(): print(f"\n=== Connecting to database: {db_name} ===") users = get_all_users(conn_info) print(f"Found {len(users)} users in {db_name}") # 获取当前数据库的查询条件(从程序变量中获取) where_clause = where_conditions.get(db_name, None) for user in users: print(f"Querying table '{table_name}' for user '{user}' in {db_name}") df = query_table(conn_info, user, table_name, where_clause) if not df.empty: all_data.append(df) print(f"\nExporting all data to a single sheet in {output_file}") export_to_single_sheet(all_data, output_file) print("✅ Export completed successfully!") if __name__ == "__main__": main() ``` --- ## ✅ 关键代码解释 ```python combined_df = pd.concat(dataframes, ignore_index=True) ``` - `pd.concat()`:将多个 DataFrame 合并一个 - `ignore_index=True`:重置索引,避免重复索引问题 ```python combined_df.to_excel(output_file, sheet_name=sheet_name[:31], index=False) ``` - `to_excel()`:导出到 Excel 文件 - `index=False`:不导出行索引 - `sheet_name[:31]`:Excel sheet 名不能超过 31 个字符,做截断处理 --- ## ✅ 示例输出 - 所有用户的查询结果会合并一个大表 - 导出到 `output_combined.xlsx` 的一个 sheet 中(默认 sheet 名为 `CombinedData`) --- ## ✅ 注意事项 | 事项 | 说明 | |------|------| | 数据一致性 | 合并时建议确保所有 DataFrame 的列一致,否则会自动填充 `NaN` | | 表头区分 | 如果你想知道每一部分数据来自哪个用户,可以在每个 DataFrame 中增加一列,如 `source_user` | | 性能问题 | 如果数据量非常大,合并后可能影响 Excel 打开速度,建议控制总数据量 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值