赞
踩
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。