python处理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()