当前位置:   article > 正文

Python运用openpyxl进行批量excel文件合并_openxl合并多个excel

openxl合并多个excel

1、安装 openpyxl

pip install openpyxl

2、安装 pypiwin32

pip install pypiwin32

3、代码说明

本段代码对指定的目录下所有(包括子目录下的)excel文件进行合并,并保存到result.xlsx文件。当然合并的excel文件要有相同的格式,也有相同的列,否则就没有什么意义。本代码未对超过单sheet页条数进行分sheet,已设变量,因暂时没有超过100万条的数据去处理,所以没有完成这个功能代码,有需要的可自行扩展一下。

附:

import openpyxl
import os
import sys
import re
import win32com.client

currentpath = r"C:\test" #需要合并文件的主目录,所有文件要格式基本一致才可使用
os.chdir(currentpath)  # 将当前工作目录修改为待修改文件夹的位置
vnrow = 1  # 标题栏行数 ,根据需要调整此值
filelist = []   #保存所有excel文件名

#因openpxl只能处理xlsx格式,所以进行格式转换,将xls变换成xlsx格式
def xlstoslsx(fname, ftype):
    excel = win32com.client.gencache.EnsureDispatch('Excel.Application')  
    # fname=currentpath+"\\"+fname
    wb = excel.Workbooks.Open(fname)
    if ftype == 'xls':
        newfilename = fname + 'x'
    else:
        newfilename = fname[:fname.rfind('.')] + '.xlsx'
    wb.SaveAs(newfilename, FileFormat=51) # 看MIME手册 51代表2007格式
    wb.Close()
    os.remove(fname)
    return newfilename

#进行文件类型检查,只处理excel文件
def checkfiletype(fname):
    pat = ".+\.(xlsx?|csv)"  # 匹配文件名正则表达式
    pattern = re.findall(pat, fname)  # 进行匹配
    if len(pattern) > 0:
        listext = pattern[0].split('.')
        n = len(listext) - 1
        if listext[n] == "xlsx":
            return fname
        elif listext[n] == "xls" or listext[n] == "csv":
            fnewname = xlstoslsx(fname, listext[n])
            return fnewname
    else:
        return '0'


# 遍历目录下的文件,递归调用
def __file_list__(path, level):
    path = path + "/"
    files = os.listdir(path)
    for i in files:
        path_tmp = path + i
        if os.path.isdir(path_tmp):
            __file_list__(path_tmp, level + 1)
        else:
            filelist.append(path_tmp)
    pass

#调用
def file_list(path):
    level = 0
    __file_list__(path, level)
    pass


file_list(currentpath)
print("共" + str(len(filelist)) + "个文件")

# 创建一个Workbook对象以保存合并的数据
resultwb = openpyxl.Workbook()
# 创建一个Sheet对象
SheetIndex = 0 #当超过100条可以对此变量进行处理
SheetRow = 1 #标题号处理
resultSheet = resultwb.create_sheet(index=SheetIndex, title="Sheet1")

for fileName in filelist:  # 遍历文件filelist中的所有文件名
    filename = checkfiletype(fileName)
    if filename == '0':  # 非处理文件跳过
        print(fileName + " 跳过")
        continue
    print(filename)
    wb = openpyxl.load_workbook(filename)
    for name in wb.sheetnames:  # 对每个sheet页进行处理,前提是格式一致
        sheet = wb[name]
        nrow = sheet.max_row - int(vnrow) + 1  # vnrow为标题栏
        if SheetRow == 1:
            for i in range(1,sheet.max_column):
                resultSheet.cell(row=SheetRow, column=i).value = sheet.cell(row=1, column=i).value  # 复制标题
        # print(sheet.max_row - vnrow)  # 实际记录数
        for i in range(vnrow + 1, nrow+1):
            SheetRow = SheetRow + 1
            for j in range(1,sheet.max_column):
                resultSheet.cell(row=SheetRow, column=j).value = sheet.cell(row=i, column=j).value  # 复制数据
    wb.close()
resultwb.save(currentpath + "/result.xlsx")
os.chdir(currentpath)  # 改回程序运行前的工作目录
sys.stdin.flush()  
 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号