多个excel文件合并为一个excel

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()

你可能感兴趣的:(python)