Python-Excel的操作

@TOC## 标题
涉及到Excel的读写,样式设置,新增表格等。测试excel文末有下载链接。

#-*-coding:gb2312-*-     #中文
import xlrd
import xlwt
import numpy as np

#打开路径
openFilePath = ""
#保存路径
saveFilePath = ""
with open('filePath.txt') as file_object: 
	lines = file_object.readlines()
	openFilePath = lines[0].strip()
	saveFilePath = lines[1].strip()
file_object.close()

#打开源数据excel
workbook = xlrd.open_workbook(openFilePath)
sheet0 = workbook.sheets()[0]
rows = sheet0.nrows
cols = sheet0.ncols


termList = []
subjectList = []
allDataMap = {}

#获取学期信息
for i in range(cols):
	colValue = sheet0.row_values(0)[i]
	if(len(colValue) and i != 0):
		termList.append(colValue)
#获取科目信息		
for i in range(6,15):
	subjectList.append(sheet0.row_values(1)[i])
#print(termList)
#print(subjectList)
termLen = len(termList)

#读取源Excel数据到缓存
for i in range(2,rows):
	name = sheet0.row_values(i)[3]
	allDataMap[name] = {}
	for j in range(len(termList)):
		allDataMap[name][termList[j]] = {}
		for k in range(len(subjectList)):
			allDataMap[name][termList[j]][subjectList[k]] = sheet0.row_values(i)[6+j*9+k]

#print(allDataMap)
#写总学生数文件
with open('sum.txt', 'w') as file_object_sum: 
	file_object_sum.write(str(len(allDataMap)))
file_object_sum.close()
#设置居中
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
#定义Excel表格样式
def set_style(name,height,bold=False):
	style = xlwt.XFStyle()
	font = xlwt.Font()
	font.name = name
	font.bold = bold
	font.color_index = 4
	font.height = height
	style.font = font
	style.alignment = alignment
	return style

#根据每个学生生成相应的excel
studentNum = 1
for name,termMsg in allDataMap.items():
	#写进度文件
	with open('progress.txt', 'w') as file_object_progress: 
		file_object_progress.write(str(studentNum))
	file_object_progress.close()
	
	termMsg['平均值']={}
	writeWorkBook = xlwt.Workbook()
	sheet_write = writeWorkBook.add_sheet('个人成绩打印表',cell_overwrite_ok=True)

	#写第一行
	sheet_write.write(0,0,name,set_style('宋体',290,True))
	sheet_write.col(0).width = 200*25
	
	for i in range(1,13):
		if(i%2 == 0):
			sheet_write.write(0,i,'班排',set_style('宋体',240)) 			
		else:
			sheet_write.write(0,i,subjectList[int(i/2)],set_style('宋体',240))
	sheet_write.write(0,13,'总分',set_style('宋体',240,True)) 		 
	sheet_write.write(0,14,'年排',set_style('宋体',240,True))
	sheet_write.write(0,15,'班排',set_style('宋体',240,True))
	#写每学期成绩
	rowNum = 1
	allTermSubGrade = {} #每列成绩
	for listIndex in range(1,16):
		allTermSubGrade[listIndex] = []
	
	for termName,gradeList in termMsg.items():	
		sheet_write.write(rowNum,0,termName,set_style('宋体',240))				
		#统计平均值
		if(termName == '平均值'):
			sheet_write.write(rowNum,0,termName,set_style('宋体',240,True))
			for subjectIndex in range(1,16):
				#print(allTermSubGrade[subjectIndex])
				sumValue = int(0)
				length = len(allTermSubGrade[subjectIndex])	
				for values in allTermSubGrade[subjectIndex]:
					if len(str(values)) != 0:
						sumValue = int(values)+sumValue			
				avg = round(sumValue/length)
				sheet_write.write(rowNum,subjectIndex,avg,set_style('宋体',240,True))
			#print(allTermSubGrade)
		else:
			#记录每科成绩并统计班排	
			for sujIndex in range(1,16):
				if sujIndex >= 13 :#最后三列
					allgrade = gradeList[subjectList[sujIndex-7]]
					if isinstance(allgrade,float):
						allgrade = round(allgrade)
					allTermSubGrade[sujIndex].append(allgrade)
					sheet_write.write(rowNum,sujIndex,allgrade,set_style('宋体',240,True))
				else:#
					if sujIndex%2 != 0 : #科目列
						subGrade = gradeList[subjectList[int(sujIndex/2)]]
						if isinstance(subGrade,float):
							subGrade = round(subGrade)
						allTermSubGrade[sujIndex].append(subGrade)
						sheet_write.write(rowNum,sujIndex,subGrade,set_style('宋体',240))
					else:#班排							
						#统计班排
						sub_name = subjectList[int((sujIndex-1)/2)]
						sub_grade = 0.0
						subAllGrade = [] #存储该学期所有同学成绩
						for student in allDataMap.keys():
							if isinstance(allDataMap[student][termName][sub_name],float):
								subAllGrade.append(allDataMap[student][termName][sub_name])
								if student == name:
									#print("find the student,grade = :"+str(allDataMap[student][termName][sub_name]))
									sub_grade = allDataMap[student][termName][sub_name]
						#print(subAllGrade)						
						sortedList = sorted(subAllGrade,reverse=True)#从大到小排序
						if sub_grade in sortedList :
							sortIndex = sortedList.index(sub_grade)+1
						allTermSubGrade[sujIndex].append(sortIndex)
						sheet_write.write(rowNum,sujIndex,sortIndex,set_style('宋体',240))
		rowNum+=1
	#保存Excel
	writeWorkBook.save(saveFilePath+'/个人成绩_'+name+'.xlsx')
	studentNum += 1
	

测试Excel表格下载链接:
https://pan.baidu.com/s/1km_hPmaXshSsGvLfsAGwaQ
注意: 运行目录下需要创建名为filePath.txt的如下所示文档:
在这里插入图片描述
第一行:excel表格路径
第二行:生成excel文件的路径

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Steve107

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值