基于Python的批量处理execl文件内容

今天遇到一个棘手的问题,在三个文件夹中将近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数据库中,然后再通过数据库技术导出所需的数据,可惜没有成功。下次有机会再继续尝试

posted @ 2022-11-10 01:30  PD_Ming  阅读(74)  评论(0编辑  收藏  举报