Python openpyxl库实现将同一目录下的excel文件合并为一个excel功能(包含格式,不含宏),运行程序后,输入要生成的excel文件名称即可
import os
import copy
import sys
import openpyxl
from openpyxl.utils import get_column_letter
import win32com.client as win32
#功能目标:将同目录下的多个excel合并到同一个excel中,sheet页以excel文件名称+sheet页名称来命名
#-----------------------------
#实现xls文件转化为xlsx文件
#函数名称:xls_to_xlsx(file)
#file xls文件
#------------------------------------------------------------------------------------------
def xls_to_xlsx(file):
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(file)
wb.SaveAs(file + 'x', FileFormat=51) # FileFormat = 51 is for .xlsx extension
wb.Close() # FileFormat = 56 is for .xls extension
excel.Application.Quit()
#------------------------------------------------------------------------------------------
#实现不同excel文件的sheet页复制 全格式复制
#函数名称:sheet copy(source excel,target excel)
#source_excel 源excel文件 target_excel 目标excel文件
#将源exce1文件的各个sheet页原样复制到目标excel文件
#------------------------------------------------------------------------------------------
def sheet_copy(source_excel,target_excel):
#判断源文件和目标文件是否为excel文件
if((source_excel.split('.')[1]!='xls' and source_excel.split('.')[1]!='xlsx') or (target_excel.split('.')[1]!='xls' and target_excel.split('.')[1]!='xlsx')):
print('文件类型错误,请输入excel文件类型')
sys.exit()
source_file_name = source_excel.split('.')[0]
wb = openpyxl.load_workbook(source_excel)
#判断目标文件是否存在,不存在创建
if(os.path.isfile(target_excel) == False):
wb2 = openpyxl.Workbook()
wb2.save(target_excel)
wb2 = openpyxl.load_workbook(target_excel)
#获取源文件的sheet页名称 使用文件名+sheet页名作为目标excel文件的sheet页命名
sheetnames = wb.sheetnames
for sheetname in sheetnames:
print(sheetname)
sheet = wb[sheetname]
sheet2 = wb2.create_sheet(source_file_name+'_'+sheetname)
# tab颜色
sheet2.sheet_properties.tabColor = sheet.sheet_properties.tabColor
# 开始处理合并单元格形式为“(,),替换掉(,)' 找到合并单元格
wm = list(sheet.merged_cells)
if len(wm) > 0:
for i in range(0, len(wm)):
cell2 = str(wm[i]).replace('(, '').replace('>,)', '')
sheet2.merge_cells(cell2)
for i, row in enumerate(sheet.iter_rows()):
sheet2.row_dimensions[i + 1].height = sheet.row_dimensions[i + 1].height
for j, cell in enumerate(row):
sheet2.column_dimensions[get_column_letter(j + 1)].width = sheet.column_dimensions[
get_column_letter(j + 1)].width
sheet2.cell(row=i + 1, column=j + 1, value=cell.value)
# 设置单元格格式
source_cell = sheet.cell(i + 1, j + 1)
target_cell = sheet2.cell(i + 1, j + 1)
target_cell.fill = copy.copy(source_cell.fill)
if source_cell.has_style:
target_cell._style = copy.copy(source_cell._style)
target_cell.font = copy.copy(source_cell.font)
target_cell.border = copy.copy(source_cell.border)
target_cell.fill = copy.copy(source_cell.fill)
target_cell.number_format = copy.copy(source_cell.number_format)
target_cell.protection = copy.copy(source_cell.protection)
target_cell.alignment = copy.copy(source_cell.alignment)
if 'Sheet' in wb2.sheetnames:
del wb2['Sheet']
if(source_excel.split('.')[1]=='xls'):
os.remove(source_excel+'x')
wb2.save(target_excel)
wb.close()
wb2.close()
def main():
path = os.getcwd()
files = os.listdir(path)
if(len(files)==0):
sys.exit()
excel_list = []
for file in files:
if(file.split('.')[1]=='xls'):
xls_to_xlsx(os.path.join(path,file))
files = os.listdir(path)
for file in files:
if (file.split('.')[1] == 'xlsx'):
excel_list.append(file)
print(excel_list)
file_name = input("请输入最终生成的excel文件名称")
oneexcel = openpyxl.Workbook()
oneexcel.save(file_name+'.xlsx')
for f in excel_list:
sheet_copy(f,file_name+'.xlsx')
for file in files:
if(file.split('.')[1]=='xls'):
os.remove(file+'x')
if __name__ == '__main__':
main()