背景

工作中经常会遇到有格式一模一样的excel文档合并成一个单独的,一般我们的都是手动复制,excel少的话手动操作下就行,如果很多,就是麻烦,今天就来说下在python中如何解决这个问题

在python中使用openpyxl模块合并多个excel文件

xlsxwriter不能操作现有的excel! xlwt、wlrd只能读写xls文件,而不能操作xlsx文件 所以只能用openpyxl,只能操作xlsx,但是更方便! execel 合并器!根据字段合并,且允许sheet不同

不支持xls!! 后面考虑转换 自动转换可能会有问题的

实现代码如下:

import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def find_excel_list():
    excel_list = []
    try:
        dir_path = 'input'
        files = os.listdir(dir_path )
        for file in files:
            if '.xlsx' in file:
                excel_list.append(dir_path+'/'+file)
    except Exception,e:
        pass
    return excel_list

def gen_xls(excel_list):
    from openpyxl import Workbook, load_workbook
    from openpyxl.drawing.image import Image

    if len(excel_list)<2:
        return
    data_dict = {}
    for excel_file in excel_list:
        new_wb = load_workbook(excel_file)
        sheet_names = new_wb.get_sheet_names()
        for sheet_name in sheet_names:
            data_sheet = new_wb.get_sheet_by_name(sheet_name)
            for row in data_sheet.iter_rows():
                row_num = row[0].row
                if row_num == 1: # 字段标记
                    print row[0].value
                    sheet_name = row[0].value # 用第一个字段命名,后面可以映射回去
                    if not sheet_name in data_dict:
                        data_dict[sheet_name]=[]
                        data_dict[sheet_name].append(row)
                else:
                    data_dict[sheet_name].append(row)

    wb = Workbook()
    for  sheet_name in data_dict:
        # sheet = wb.get_sheet_by_name(u"汇总销量")
        sheet = wb.create_sheet(sheet_name)
        for row in  data_dict[sheet_name]:
            sheet.append([cell.value for cell in row])
        wb.save('result.xlsx') # 貌似可以保存多次的

if __name__ == '__main__':
    excel_list = find_excel_list()
    gen_xls(excel_list)