关于python读写excel表格的两三个例子

2022-03-11 14:10:21 浏览数 (1)

关于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)

0 人点赞