今天遇到一个棘手的问题,在三个文件夹中将近60个execl表选出所需的特定三列数据,且表名,sheet名,表中的数据类型均不一致,故想到利用Python批量化处理技术手段进行处理。其原理是先读取每个表头,通过填充使其一致,然后将三个文件夹内的execl全部集中到一个文件内,然后通过读取所需的三列数据进行提取,并且在按序读取的过程中,一旦表头为空即该表停止读取。然后将读取出来的数据存储到新的表中。
import openpyxl import os #打印表头 def printSheetTitle(row): a = '' b = 0 for col in row: if col.value: a = a + col.value + ',' b += 1 else: break # print("{0},{2},{1}".format(file, a, b)) return #获取有用的列号 def findColNo(row): classColNo = '' nameColNo = '' idColNo = '' for col in row: if col.value == None: break if col.value.find("姓") > -1 : nameColNo = col.column elif col.value.find("班级") > -1: classColNo = col.column elif col.value.find("身份") > -1: idColNo = col.column # print("{0},{1},{2}, {3}".format(file, nameColNo, classColNo, idColNo)) return nameColNo, classColNo, idColNo def printExcel(basePath, file, summarySheet): wb = openpyxl.load_workbook(basePath+'\\'+file, read_only=False) activeSheet = wb.active # print("{0}是:{1}*{2}的表格".format(activeSheet['A1'].value ,activeSheet.max_row-2, activeSheet.max_column)) tRows = activeSheet[2] #打印表头 printSheetTitle(tRows) #获取有用的列号 nameColNo, classColNo, idColNo = findColNo(tRows) res = [] for num in range(3, 1000): # print(activeSheet["C"+str(num)].value) if activeSheet["A"+str(num)].value == None: break data = [activeSheet.cell(row=num, column=nameColNo).value, activeSheet.cell(row=num, column=classColNo).value, activeSheet.cell(row=num, column=idColNo).value] print(data) summarySheet.append(data) basePath = r"C:\xxx\xxx\xxx\xxx\xxx" files = os.listdir(basePath) summaryWork = openpyxl.load_workbook(basePath+'\\all.xlsx', read_only=False) summarySheet = summaryWork.active for file in files: # print(file) printExcel(basePath, file, summarySheet) summaryWork.save('all.xlsx')
该个技术有一个软肋,即openxl无非支持读取xls的文本文件,故需将xls的文件替换成xlsx或xlsm。
本次实验还有一个思路,通过读取execl表的方式将数据导入到mysql数据库中,然后再通过数据库技术导出所需的数据,可惜没有成功。下次有机会再继续尝试
标签:execl,批量,Python,activeSheet,value,column,file,col,row From: https://www.cnblogs.com/PD-yin996649850/p/16875746.html