首页 > 解决方案 > 将各种excel中的同名表合并为一张

问题描述

我正在尝试将多个具有相同名称的 Excel 中的工作表合并到一个 Excel 工作表中

已尝试以下代码:

import os
import pandas as pd

files = os.listdir("XXXX")

print("All files in the given directory are :", files)

files_xlsx = [f for f in files if f[-4:] == 'xlsx']

print("Excel files in this directory are :", files_xlsx)

y = "XXXX"

excels = [pd.ExcelFile(y +'\\'+ name) for name in files_xlsx]

for each in excels:
    sheets =pd.ExcelFile(each).sheet_names

print ("Sheet names in these excel files are : ", sheets)

NSheets = len(sheets)

print ("Number of different Sheet names in these excel files are : ", NSheets)

for z in sheets:
        frames = [x.parse(x.sheet_names[i], header=None,index_col=None) for x in excels]
        frames[1:] = [df[1:] for df in frames[1:]]
        combined = pd.concat(frames)
        combined.to_excel("XXXX\\Output_" + z + ".xlsx", header=False, index=False)

这会导致使用不同的工作表名称创建多个文件,但所有这些工作表都具有与工作表 1 中相同的数据。数据不正确。

标签: excelpython-3.x

解决方案


我不是 100% 确定我是否完全理解您的问题,但我按照您的要求阅读了每个唯一的 Excel 工作表名称输入的 1 个输出 Excel 文件。如果是这样,那么试试这个:

import os
import pandas as pd

files = os.listdir("XXXX")

print("All files in the given directory are :", files)

files_xlsx = [f for f in files if f[-4:] == 'xlsx']

print("Excel files in this directory are :", files_xlsx)

y = "XXXX"

excels = [pd.ExcelFile(y +'\\'+ name) for name in files_xlsx]

for each in excels:
    sheets =pd.ExcelFile(each).sheet_names


print ("Sheet names in these excel files are : ", sheets)

NSheets = len(sheets)

print ("Number of different Sheet names in these excel files are : ", NSheets)

for z in sheets:
    frames = list()
    for x in excels:
        try:
            x.sheet_names.index(z)
            frames.append(x.parse(x.sheet_names.index(z), header=None, index_col=None))
            frames[1:] = [df[1:] for df in frames[1:]]  # keep only header from first file for each sheetname
            combined = pd.concat(frames)
            combined.to_excel("XXXX\\Output_" + z + ".xlsx", header=False, index=False)
        except:
          pass

如果我正确理解了您的问题,那么这应该可以满足您的要求。

PS:我添加了之前取出的行(只保留第一个标题),它似乎符合我的小测试样本的要求


推荐阅读