excel合并
优势:不管下级文件夹有多少,都可以找到excel并合并
点击3下,批量操作
改进点:必须要求列索引(列标题)一样
sheet功能未添加
数据去重(依据实际业务情况,不一定是id去重)
import os# FROM_DIR = os.getcwd()# TO_FILE = os.path.join(FROM_DIR, 'combine.xlsx')# print(FROM_DIR)# # print(TO_FILE)# # D:\PycharmProjects\combine_excel# # D:\PycharmProjects\combine_excel\combine.xlsx## for _root, _dirs, _files in os.walk(FROM_DIR): # dirs 文件夹 files 文件# print(_files)##!/usr/local/bin/python3# -*- coding: utf-8 -*-'''合并指定文件夹下所有Excel文件到同一个文件'''import osimport collectionsimport operator # 进行加减乘除等等运算from openpyxl import load_workbookfrom openpyxl import Workbookdef search_excel(from_dir, to_file): '''遍历from_dir文件夹,查找Excel文件,返回结果列表 s.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。 ''' _results = [] for _root, _dirs, _files in os.walk(from_dir): # root 路径 dirs 路径下的文件夹 files 文件夹内的文件名 print(_root,_dirs,_files) for _file in _files: if _file.endswith('.xlsx'): _results.append(os.path.join(_root, _file)) print("_results:",_results) # 获得路径列表 try: print('Remove combine.xlsx.') print("to_file:",to_file) _results.remove(to_file) # remove() 函数用于移除列表中某个值的第一个匹配项。 except ValueError: print('combine.xlsx not exist.') return _resultsdef load_excel(excel_file): '''读取Excel文件内容,返回Excel的标题数组和数据有序字典 excel_file : excel文件的路径 ''' _wb = load_workbook(excel_file, read_only=True) _ws = _wb.active # print(type(_ws),"----------------------------") #_title = [] _items = collections.OrderedDict() for _r in _ws.rows: # 按行获取单元格(Cell对象) - 生成器 print("_r:",_r) if not _title: for _i in _r: print(_i.value) _title.append(_i.value) else: _item = [] for _i in _r: print(_i.value) _item.append(_i.value) _items[_item[0]] = _item _wb.close() print(_title,_items,'---------------------------') return _title, _itemsdef save_excel(excel_file, excel_title, excel_items): '''保存Excel文件''' _wb = Workbook() _ws = _wb.active _ws.append(excel_title) for _k, _v in excel_items.items(): _ws.append(_v) _wb.save(excel_file)def combine(from_dir, to_file): '''合并指定文件夹下所有Excel文件到同一个文件 collections(英文,收集、集合),里面自带了一个子类OrderedDict,实现了对字典对象中元素的排序。 ''' _excel_files = search_excel(from_dir, to_file) # 返回一个列表,列表内数各个文件的路径 if not _excel_files: return _excel_title = [] _excel_content = collections.OrderedDict() for _file in _excel_files: print('Parsing ' + _file) _title, _items = load_excel(_file) # 调用load_excel 函数 if not _title or not _items: print('Skip since it is empty.') continue if not _excel_title: _excel_title = _title elif not operator.eq(_title, _excel_title): print('Warning: Excel title format are different!') for _k, _v in _items.items(): _excel_content[_k] = _v print('Parsing done.') if not _excel_title or not _excel_content: print('All files is empty.') return save_excel(to_file, _excel_title, _excel_content)if __name__ == "__main__": print('begin') FROM_DIR = os.getcwd() TO_FILE = os.path.join(FROM_DIR, 'combine.xlsx') combine(FROM_DIR, TO_FILE) print('end')