python 使用 openpyxl 模块合并多个Excel内容到一个Excel文件里
注意:
- 只支持.xlsx格式,2003,2007版本的.xls文件不支持
- 文件绝对路径中,文件名或文件夹名称中不能有任何空格出现。
1 # *-* coding-utf-8 *-* 2 import sys 3 4 # 在path里追加,python.exe解释器,目录下的第三方模块的文件夹路径。以免在cmd.exe中运行时,找不到模块。【注意:】在不同的PC上时,需要更改此路径 5 sys.path.append(r\'C:\Users\gk\AppData\Local\Programs\Python\Python37\Lib\site-packages\') 6 7 import os 8 9 def merge_Excel(excelpath_list, new_excel_path=os.path.dirname(__file__)+\'\\合并的文件.xlsx\', source_all_sheet=True): 10 \'\'\' 11 将多个excel文件,合并到一个新的excel里。 12 :param excelpath_list: 要合并的excel文件路径列表 13 :param new_excel_path: 合并后的excel文件路径 14 :param source_all_sheet: 是否合并源Excel中的所有工作表 15 :return: 16 \'\'\' 17 if len(excelpath_list) == 0: 18 return False 19 from openpyxl import Workbook 20 from openpyxl import load_workbook 21 22 sheet_count = 0 23 24 # 实例化一个新的工作簿,用户保存合并的数据 25 wb_new = Workbook() 26 27 for excel_path in excelpath_list: # 第1层循环,遍历所有的Excel文件 ========================================= 28 wb = load_workbook(excel_path) # 载入源excel文件,获取工作簿 29 wb.guess_types = True # 猜测格式类型 30 # 获取 工作簿中的所有sheet 31 if source_all_sheet: 32 ws_all = wb.worksheets 33 else: 34 ws_all = [wb.active] 35 36 for sheet in ws_all: # 第2层循环,遍历每个Excel的sheet ========================================= 37 # 获取 sheet中的有效行数、列数 38 count_row = 0 # 工作表的有效行数 39 count_col = 0 # 工作表的有效列数 40 for row in sheet.rows: 41 count_row += 1 42 for col in sheet.columns: 43 count_col += 1 44 if count_row==0 or count_col==0: #如果有效行数/列数为0,代表当前表没有数据 [重要] 45 continue 46 47 # 读取sheet的内容,写入到新工作簿的工作表中 48 list_all = [] 49 row_range = sheet[1:count_row] 50 list_row = [] 51 tag=False 52 53 for row in row_range: 54 if type(row) is not tuple: # 判断row的类型是不是元祖,如果不是元祖,代表当前sheet只有一行数据,row就是单元格对象; 反之,row是包含了整行单元格对象的元祖 55 tag = True 56 break 57 if tag: # 代表当前sheet只有一行数据,row就是单元格对象; 58 for cell in row_range: # 第3层循环 遍历工作表的行、列。封装数据 ============================== 59 list_row.append(cell.value) 60 list_all.append(list_row) # 将1行中的所有列的数据(列表类型),在添加进总列表里 61 else: # 代表 当前sheet有多行数据 62 for row in row_range: 63 list_row = [] # 清空 64 for cell in row: 65 list_row.append(cell.value) # 遍历1行中的每列数据,读取后,添加进一个列表 66 list_all.append(list_row) # 将1行中的所有列的数据(列表类型),在添加进总列表里 67 68 # 将源sheet中提取后,封装的数据写入新的工作表 69 ws_temp = wb_new.create_sheet(\'sheet-%s\' % sheet_count) 70 for item in list_all: # 第3层循环 将提取的原sheet数据 循环写入到新的sheet里 71 # 判断用户选择是否合并到一个sheet 72 ws_temp.append(item) 73 sheet_count += 1 74 75 # 保存文件 76 wb_new.save(new_excel_path) 77 return True 78 79 def run(): 80 # 1. 获取用户设置的文件保存路径 81 ini_path=os.path.join(os.path.dirname(__file__),"P18Config",\'Path_User.ini\') # 组织 Path_User.ini 文件的路径 82 83 # 从 Path_User.ini 里获取 用户 设置的 文件导出路径 84 with open(ini_path,\'rt\',encoding="utf-8") as f: 85 user_path= f.readline().strip() 86 # 组织当前日期的文件夹路径 87 import time 88 folder_path=user_path+os.sep+time.strftime("%Y-%m-%d") 89 90 # 2. 组织 合成后的新excel文件的绝对路径,判断该文件,是否已经存在 91 new_excel_path = os.path.join(folder_path, time.strftime("%Y-%m-%d") + "_全天产品数据.xlsx") 92 if os.path.exists(new_excel_path): 93 os.remove(new_excel_path) # 删除该文件 94 95 # 3.组织所有要合并的excel文件的绝对路径,添加进list 96 list_file=os.listdir(folder_path) # 获取日期文件夹下的所有文件名称列表 97 list_file_path=[ ] 98 for item in list_file: 99 list_file_path.append(os.path.join(folder_path,item) ) 100 print(list_file_path) 101 102 # 4.调用函数,合并 所有excel 103 res = merge_Excel(list_file_path,new_excel_path) 104 if res: 105 print("合并成功") 106 107 108 if __name__ == "__main__": 109 run()