python处理excel合并

  • 前言
  • 源码


前言

本篇博客是记录自己处理班级早起打卡,日常学习情况(数据来源与腾讯文档收集)

Python 写入多个Excelsheet python处理多个excel表_excel

源码

import xlrd
import xlwt
import os


"""
xlrd操作:
1、常用单元格中的数据类型
     ♦ 0. empty(空的),1 string(text), 2 number, 3 date, 4 boolean, 5 error, 6 blank(空白表格)
2、打开Excel文件读取数据
    data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个r原生字符。
3、获取book中一个工作表
    table = data.sheets()[0]          #通过索引顺序获取
    table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取
    table = data.sheet_by_name(sheet_name)#通过名称获取
    以上三个函数都会返回一个xlrd.sheet.Sheet()对象
    names = data.sheet_names()    #返回book中所有工作表的名字
    data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕
4、行的操作
    nrows = table.nrows  #获取该sheet中的有效行数
    table.row(rowx)  #返回由该行中所有的单元格对象组成的列表
    table.row_slice(rowx)  #返回由该列中所有的单元格对象组成的列表
    table.row_types(rowx, start_colx=0, end_colx=None)    #返回由该行中所有单元格的数据类型组成的列表
    table.row_values(rowx, start_colx=0, end_colx=None)   #返回由该行中所有单元格的数据组成的列表
    table.row_len(rowx) #返回该列的有效单元格长度
5、列(column)的操作
    ncols = table.ncols   #获取列表的有效列数
    table.col(colx, start_rowx=0, end_rowx=None)  #返回由该列中所有的单元格对象组成的列表
    table.col_slice(colx, start_rowx=0, end_rowx=None)  #返回由该列中所有的单元格对象组成的列表
    table.col_types(colx, start_rowx=0, end_rowx=None)    #返回由该列中所有单元格的数据类型组成的列表
    table.col_values(colx, start_rowx=0, end_rowx=None)   #返回由该列中所有单元格的数据组成的列表
6、单元格的操作
    table.cell(rowx,colx)   #返回单元格对象
    table.cell_type(rowx,colx)    #返回单元格中的数据类型
    table.cell_value(rowx,colx)   #返回单元格中的数据
    table.cell_xf_index(rowx, colx)   # 暂时还没有搞懂
"""
# 全局变量区:
xh = []  # 学号
name = []  # 姓名


def get_student_info(filename=r"../file/classinfo.xlsx"):
    """
    读取文件的学生信息
    :param filename: 文件路径
    :return: (学号,姓名)
    """
    # 文件数据格式 学号 姓名
    data = xlrd.open_workbook(filename)  # 文件名以及路径,如果路径或者文件名有中文给前面加一个r原生字符。
    table = data.sheet_by_index(0)
    # 返回(学号,姓名)
    return table.col_values(colx=0, start_rowx=1), table.col_values(colx=1, start_rowx=1)


def deal_early_rising(filename):
    """
    处理早起信息表
    :param filename: 处理文件路径及名称
    :return: 返回标签,打卡时间
    """
    # print(filename)
    data = xlrd.open_workbook(filename)
    table = data.sheet_by_index(0)
    # 提交者(自动)    提交时间(自动)    你的姓名(QQ名) 打卡时间 打卡身份([姓名] 学号:[]) 打卡位置  资源地址 打卡选项
    # 使用腾讯文档收集表导出的表格 文件命名格式:[月].[日] [文件信息].xlsx
    time = [s.split()[1] for s in table.col_values(colx=3, start_rowx=1)]  # 返回hh:mm:ss
    # print(type(time[0]))  # str
    # time = table.col_slice(colx=3, start_rowx=1)
    # print(time[0])  # text
    student_name = [s.split()[0] for s in table.col_values(colx=4, start_rowx=1)]  # 返回姓名
    clock_time = []
    # 签到时间,未签到设为‘未签到’
    for i in name:
        if i not in student_name:
            clock_time.append("未签到")
        else:
            clock_time.append(time[student_name.index(i)])
    label = table.cell_value(rowx=1, colx=3).split()[0] + table.cell_value(rowx=0, colx=3)
    # 返回标签,打卡时间
    return label, clock_time


def deal_study_exercise(filename):
    """
    处理学习锻炼表
    :param filename: 处理文件路径及名称
    :return: (学习标签名,学习情况,锻炼标签名,锻炼时长)
    """
    print(filename)
    data = xlrd.open_workbook(filename)
    table = data.sheet_by_index(sheetx=0)
    # 提交者(自动)	提交时间(自动)	姓名	学号	锻炼时长	是否学习
    student_name = table.col_values(colx=2, start_rowx=1)
    exercise = table.col_values(colx=4, start_rowx=1)
    study = table.col_values(colx=5, start_rowx=1)
    # print(table.cell_value(rowx=1, colx=1))  # 返回是数值类型
    # print(xlrd.xldate_as_datetime(table.cell_value(rowx=1, colx=1), 0).strftime('%Y-%m-%d')) 转换为日期类型
    exercise_time, study_time = [], []
    for i in name:
        if i in student_name:
            index = student_name.index(i)
            exercise_time.append(exercise[index])
            study_time.append(study[index])
        else:
            exercise_time.append("未提交")
            study_time.append("未提交")
    label = xlrd.xldate_as_datetime(table.cell_value(rowx=1, colx=1), 0).strftime('%Y-%m-%d')  # 获取时间
    return label+"是否学习", study_time, label+"锻炼时长", exercise_time


def deal_files(path=r"../file/excel"):
    """
    处理一个文件夹下所有需要汇总的表
    :param path:文件夹路径
    :return: 得到信息字典
    """
    filenames = os.listdir(path)
    message = {"学号": xh, "姓名": name}
    # deal_early_rising(path+"/"+filenames[1])  # 测试
    # deal_study_exercise(path+"/"+filenames[0])  # 测试
    for i in filenames:
        if i.find("早起")!= -1:
            label, clock_time = deal_early_rising(path+"/"+i)
            message.update({label: clock_time})
        else:
            label_1, study_time, label_2, exercise_time = deal_study_exercise(path+"/"+i)
            message.update({label_1: study_time})
            message.update({label_2: exercise_time})
    return message


def write_excel(filename=r'../file/total.xlsx'):
    """
    将得到的数据写入excel
    :param filename: 需要汇总的信息到哪个文件
    :return: None
    """
    workbook = xlwt.Workbook(encoding='utf-8')  # 创建workbook 对象
    worksheet = workbook.add_sheet('sheet1')  # 创建工作表sheet
    message = deal_files()
    index = 0
    for i, j in message.items():
        worksheet.write(0, index, i)
        index_j = 1
        for s in j:
            worksheet.write(index_j, index, s)  # 往表中写内容,第一各参数 行,第二个参数列,第三个参数内容
            index_j += 1
        index += 1
    workbook.save(filename)  # 保存表为students.xls


if __name__ == "__main__":
    xh, name = get_student_info()
    write_excel()