关于flask的事情遇到一些麻烦,暂时先搁置几天;最近工作总是在处理数据,出于偷懒的因素,最反感重复性的工作,因此当几十个上百个表哥表姐摆在面前的时候,也不太想麻烦别人,总想着用批处理的方式来解决,这不就遇到了一些问题嘛。
1、上百个excel,都有同样的列名,比如局名称、局编码和序号以及其他列
2、要将这上百个文件按照局名称拆分成不同的文件
3、按照这些局名称统计数据量
4、统计表格中的总数据量,乍看起来,4和3是一样的,其实不然,2和3是一次任务,表格是xlsx格式;4是单独的,表格是1997-2013版的xls。
python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。安装xlrd的时候,当时不能上网,有些乱,先下载的是xlrd3,xlrd3可以处理xlsx文件,xlrd1.2.0可以处理xls文件。
任务一、将表格按相应字段内容拆分成多个表格
代码语言:javascript复制# 对从系统中导出来的文件按照“局数据”中的分公司进行分割
# 这些文件有一个共同的特性,都有“局数据”字段,但分公司不完全都有数据
# 举例
# xxx.xlsx ->xxx_广州分公司.xlsx,xxx_上海分公司.xlsx
# yyy.xlsx ->yyy_广州分公司.xlsx,yyy_武汉分公司.xlsx
# zzz.xlax ->zzz_广州分公司.xlsx,zzz_上海分公司.xlsx,yyy_武汉分公司.xlsx,yyy_天津分公司.xlsx
# 因为在内网的原因,安装python的package不太方便,所以大致再网上查了一下excel的用法和差异
# 知道 openpyxl 和 xlutils、xlrd、xlwt可用,openpyxl相对比较方便一些,可以直接读写,而后者比较啰嗦
# 委托同事下载了一下whl文件本地安装,没想到openpyxl、xlutils无法安装成功
# 只好硬着头皮用xlrd、xlwt了
# xlrd用来读取excel,这个读操作还算比较方便
# xlwt用来写入excel,这个写操作未免有点低级,一个单元格一个单元格的进行操作,效率未免有点太低了
# 无论如何,还是成功了
import xlwt
import xlrd3
import os
# 获取待转换文件的文件夹路径
curpath = os.path.abspath('.') '\doc\'
# 获取当前文件夹下的文件列表
allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件
pathfilename = curpath filename
# 如果当前为文件夹对象,则跳过
if os.path.isdir(pathfilename):
continue
# 打开当前excel文件
xlsfile = xlrd3.open_workbook(pathfilename)
# 获取要打开的sheet名称
sheet_name = xlsfile.sheet_names()[0]
# 获取要打开的sheet对象
sheet = xlsfile.sheet_by_name(sheet_name)
# 获取sheet中的表格行数列数
xlsnrows, xlsncols = sheet.nrows, sheet.ncols
orgnamecol = 0 # 暂存当前要分割依据“局名称”所在的列
xlsdatalist = [] # 暂存当前excel表的数据
sheettitle = [] # 暂储当前excel表的表头
# 根据excel的总行数开始遍历
for i in range(xlsnrows):
# 首行为标题,特殊处理,存到sheettitle
if i == 0:
sheettitle = sheet.row_values(0) # 标题存到sheettitle
orgnamecol = sheettitle.index('局名称') # 查找分割数据依据的所在列的位置
else:
data = sheet.row_values(i) # 获取当前行信息
orgname = sheet.cell_value(i, orgnamecol) # 基于单元格位置,获取当前的局名称
xlsdata = [orgname, data] # 将当前局名称和当前数据组装成一个列表
xlsdatalist.append(xlsdata) # 写入xlsdatalist
# 获取分割依据-局名称有多少,作为生成excel表的基础
orglist = list(set([i[0] for i in xlsdatalist]))
# 分隔当前的文件名和后缀名,并取文件名
filesegname = filename.split('.')[0]
# 每遍历一次局名称,则生成一个excel文件
for orgname in orglist:
# 拼接文件名
xlswritefile = curpath filesegname '_' orgname '.xlsx'
# 初始化Workbook写对象
workbook = xlwt.Workbook(encoding='utl-8', style_compression=0)
# 增加一个sheet写入页
worksheet = workbook.add_sheet('sheet', cell_overwrite_ok=True)
# 构造表的标题
for i, title in enumerate(sheettitle):
worksheet.write(0, i, title)
row = 1
# 遍历xlsdatalist
# 需要注意的row和col的自增的条件
for rowdata in xlsdatalist:
# 判断当前列表是否等于该局数据
if rowdata[0] == orgname:
col = 0
# 读取当前行数据
for data in rowdata[1]:
if data:
worksheet.write(row, col, data) # 基于行列位置,开始写入数据
col = 1
row = 1
workbook.save(xlswritefile)
任务二、将表格按相应字段内容统计其数据量
代码语言:javascript复制import xlwt
import os
import pandas as pd
# 获取待转换文件的文件夹路径
curpath = os.path.abspath('.') '\doc\'
# 获取当前文件夹下的文件列表
allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件
pathfilename = curpath filename
# 如果当前为文件夹对象,则跳过
if os.path.isdir(pathfilename):
continue
# xlrd要安装1.2.0版本,最新版的不支持xls文件
# 透视表
df = pd.read_excel(pathfilename) # 这个会直接默认读取到这个Excel的第一个表单
data = df.head() # 默认读取前5行的数据
pivotdf = pd.pivot_table(df, index='局名称', values='序号', aggfunc='count')
print(pivotdf)
# 交叉表
# 必须指定列名
crossdf = pd.crosstab(index=df['局名称'], columns=df['局编码'], values=df['序号'], aggfunc='count')
print(crossdf)
# 分组统计
groupbydf = data.groupby(['局名称'])['序号'].count()
print(groupbydf)
任务三、统计老版excel表格中的总数据量
代码语言:javascript复制import xlrd3
import os
# 获取待转换文件的文件夹路径
curpath = os.path.abspath('.') '\doc2\'
# 获取当前文件夹下的文件列表
allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件
pathfilename = curpath filename
# 如果当前为文件夹对象,则跳过
if os.path.isdir(pathfilename):
continue
# 打开当前excel文件
sheetrows=0
xlsfile = xlrd3.open_workbook(pathfilename)
# 获取要打开的sheet名称
for sheet_name in xlsfile.sheet_names():
if sheet_name.find("SQL Results") == - 1:
continue
else:
# 获取要打开的sheet对象
sheet = xlsfile.sheet_by_name(sheet_name)
# 获取sheet中的表格行数列数
xlsnrows, xlsncols = sheet.nrows, sheet.ncols
# 去掉标题,循环累加
sheetrows = sheetrows xlsnrows -1
print(filename,sheetrows)