python 使用 openpyxl 模块合并多个Excel内容到一个Excel文件里

时间:2024-03-02 18:49:13

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