一、老板的需求总是莫名奇妙
- 老板需求:
一天老板说,嘿!放牛娃,将这些excel表合并到一个总表里,下班前交给我
老板话刚讲完,我心里就想,这还不简单么,excel不就是有合并表的功能么!!简单的要死!哈哈哈哈哈哈
可当我拿到excel表后,自己傻眼了,上千个,一两三个在excel里还行,这么多咋搞?????不信看下图 - 搬救兵:
顿时我就慌了,这么多我真没有在Excel里合并过,我就找了同事,同事说这还不简单,就在Excel里面写脚本呀!!,我暗暗的说,我不会,然后他甩了一句话给我,你不会你活该,谁叫你不学呀,你不会百度呀!!反正领导不是让我做,气死你
虽然我知道我的同事性格就是这样,但是我在那刻我还是很想打他,真想打他一顿,但是最后我只说了一句,我就不用Excel,我也能够搞定,你有什么可豪横的
二、别人不帮你,你帮你自己
- 有事找度娘:
首先,我在网上,csdn找了相关的文章,大多都是鱼龙混杂,可能作者自己会,但是分享给人,别人却看不懂,完全按照作者的来操作,却得不出结果,失败告终 - 程序员就拿出自己的本领
寻找无果后,我决定自己写一个python程序,将思路捋了一波后,就开始着手写了
三、上干货,看不懂,我买飞机票给你
- 思路分析一波:
""" 思路分析: 1. 创建一个空表名叫"总表",表格形式须和合并表的一样 2. 获取需要合并文件夹中的所有excel表的名字(文件名) 3. 开始遍历excel表 4. 先读取数据,然后写入事先创建好总表中 5. 当读取完下一个待合并表的数据,然后准备写入到总表时,必须先获取到总表的行数,不然之前的数据将会被覆盖掉。 6. 遍历结束,保存总表的数据 """
- 所需技能包
会用python对excel表的读操作会用python对excel表的写操作
如果上述说的不会,咋办??没事!!我帮你找出来了
四、上代码:(每一步都有注释,完全不用担心,全网最良心)
完整代码:
import os import xlwt import xlrd import xlutils.copy import time """ 公司老板需求: 1. 将上千个Excel表合并成一个表里 2. 不管你用什么方法,实现效果就行 """ # #################################### 代码走起来呀!!! """ 思路分析: 1. 创建一个空表名叫"总表",表格形式须和合并表的一样 2. 获取需要合并文件夹中的所有excel表的名字(文件名) 3. 开始遍历excel表 4. 先读取数据,然后写入事先创建好总表中 5. 当读取完下一个待合并表的数据,然后准备写入到总表时,必须先获取到总表的行数,不然之前的数据将会被覆盖掉。 6. 遍历结束,保存总表的数据 """ """ 项目运行: 1. 将所有需要合并的表放到一个文件夹中,名叫excels 2. autoMerge.py文件和excels文件夹同级 3. 运行该.py文件,会在把合并表放到destDir夹中 """ # 1.总表初始化(不友好,还需要自行写好表头列表,对非程序员不友好) def initExcel(path,excelTitle,excel_sheet_Name): """ :param path: 合并总表的路径 :param excelTitle: 总表的表头 :param excel_sheet_Name: 合并总表的sheet名称 :return: 返回总表是否初始化成功 """ try: # 创建一个工作簿 book = xlwt.Workbook(encoding="utf-8") # 创建表单 sheet = book.add_sheet(excel_sheet_Name) # 写入表头 for i in range(0,len(excelTitle)): sheet.write(0, i, excelTitle[i]) book.save(path) return True except Exception as e: return False # 1.1 总表初始化(用来解决上面的问题) def initExcel2(destExcel_path, sourceExcel_path,total_sheet_name): """ :param destExcel_path: 合并总表excel的路径 :param sourceExcel_path: 需要合并excel的路径 :param total_sheet_name: 合并总表后sheet的名字 :return: 返回False or True """ try: # 创建一个工作簿 book = xlwt.Workbook(encoding="utf-8") # 创建表单,并给表单起个名字 sheet = book.add_sheet(total_sheet_name) # 获取待需合并excel的所有文件 excel_name_list = get_All_Excelname(sourceExcel_path) # 一个待合并execl的路径 excel_path = sourceExcel_path + "/" + excel_name_list[0] # 获取excel的sheet excel_sheet = get_excel_sheet(excel_path) # 获取excel的表头数据 excel_title_list = excel_sheet.row_values(0) # 写入表头 for i in range(0,len(excel_title_list)): sheet.write(0, i, excel_title_list[i]) book.save(destExcel_path) return True except Exception as e: return False # 2.获取需要合并的所有的excel文件名 def get_All_Excelname(path): """ :param path: 待合并excel文件的路径 :return: """ excelName_list = os.listdir(path) # print(excelName_list) return excelName_list # 返回excel表的sheet对象 def get_excel_sheet(path): # 打开指定路径的excle表 book = xlrd.open_workbook(path) # 获取excle中的表单 sheet = book.sheet_by_index(0) # 返回sheet对象 return sheet # 返回总表的wtbook,sheet对象 def get_total_excel_sheet(path): """ :param path: 存放总表的path :return: """ book = xlrd.open_workbook(path, formatting_info=True) wtbook = xlutils.copy.copy(book) wtsheet = wtbook.get_sheet(0) return wtbook,wtsheet # 4. 开始遍历(合并excel表) def writeExcel(destExcel_path,source_path,excelName_list): """ :param destExcel_path: 合并总表存放的路径 :param source_path: 需要合并excel的路径 :param excelName_list: 需要合并excel表的文件名称 :return: """ # 用来记录总表中的行数 total_excel_row = 1 # 获取总表的book,sheet total_book,total_sheet = get_total_excel_sheet(destExcel_path) for excelName in excelName_list: # 文件路径 excelPath = source_path + excelName # 获取表的sheet对象 sheet = get_excel_sheet(excelPath) # 获取行数 n_rows = sheet.nrows # 开始遍历读取数据,并写入数据 for row_index in range(1,n_rows): # 获取一行的数据,列表形式 row_data_list = sheet.row_values(row_index) # 将数据写入到总表中 for j in range(0,len(row_data_list)): total_sheet.write(total_excel_row,j,str(row_data_list[j])) # 每写一行,总表行数加1 total_excel_row = total_excel_row + 1 total_book.save(destExcel_path) print("数据合并已完成") print("合并后的数据共有%d条" % (total_excel_row - 1)) # 创建文件夹 def makeDir(path): """ :param path: 传入需要创建文件夹的路径 :return: """ if not os.path.exists(path): os.mkdir(path) def main(): # 待需合并的excel文件夹路径 source_excel_path = "./excels/" # 存放合并后的excel表文件夹路径 dest_dir = "./destDir" # 创建文件夹 makeDir(dest_dir) # 合并excel表名 total_excel_name = "总表.xls" # 合并表存放路径 total_excel_path = dest_dir + "/" + total_excel_name # 合并总表中的sheet的名字 total_excel_sheet_name = "汇总表" # 初始化表 flag = initExcel2(total_excel_path,source_excel_path,total_excel_sheet_name) if flag: excelName_list = get_All_Excelname("./excels") # 打印有多少个excel表 print("总共有%d个excel表需要合并" %len(excelName_list)) # 写数据 writeExcel(total_excel_path,source_excel_path, excelName_list) else: print("初始化表失败") if __name__ == '__main__': main() time.sleep(3)
看到这,都不留个赞说不过去了吧吧!!!!
运行结果:
五、不是程序员,也别慌
为了顾及非程序也能够运行这个程序,我将它打包成一个自动合并工具,即.exe程序,看图!!
只要按照说明书那样操作,那就完事了(非常简单,双击运行即可),看到这,再不点个赞,我可要打人了哈!!!!!!!!
这么好用的工具如何获取呢? 加群:1136192749 就可以了