助教工作:关于如何使用python+excel快捷生成千帆竞发图

为什么需要这样的功能

生成千帆竞发图需要数次作业成绩列在一张总成绩表中,通过人工的方式将复数张表合并为一张效率实在底下。
而合并的操作本身却是规律性极强、重复性极强的,这通常意味着:我们可以利用程序来代替人工,从而提高效率,让我们把时间放到做更有意义的事情上去。
所以为了提高助教工作的效率,决定制作这样的一个python程序来快速生成总成绩表,然后使用excel自带的图标功能来生产千帆竞发图。

码云地址

https://gitee.com/weberpyth/python-script-set/tree/master/work/nsi/script/homework_Excel_craft

准备

python 3.5+
excel 2010 及以上
博客园班级导出作业excel功能

安装

需要安装python的第三方库xlrd,xlwt
使用pip安装即可,指令如下
pip install xlrd
pip install xlwt

数据处理思路

在博客园可以通过作业的导出excel功能快速获取某次作业的成绩。
以下是由博客园导出的某次作业的成绩

我们发现:在导出的数据中,学号是具有唯一性的,通过按学号提取多次作业的成绩,可以形成学号-历次成绩列表的映射,形如
'201879123761xxx':[9,8,...,14]
而且通过学号归纳成绩,可以避免粗暴的提取列造成的一些错误。

代码及方法

首先引入所需的库,以及声明的全局变量Data
import xlrd,sys,os,xlwt

Data = {}
然后设置读取函数,引入全局变量Data,读取过程中将学号作为字典的key,而字典的value则是list类型的数据,将各个表同样位置上的成绩依次录入到对应的list中
def dataReader(sheet):
    global Data
    for i in range(1,sheet.nrows):
        try:
            Data[sheet.row_values(i)[0]].append(sheet.row_values(i)[5])
        except:
            Data[sheet.row_values(i)[0]] = [ sheet.row_values(i)[5] ]

设置写入函数,处理全局变量Data中的数据,将其写入到另一个excel表中
def dataWriter():
    global Data
    workbook = xlwt.Workbook(encoding = 'utf-8')
    worksheet = workbook.add_sheet('Final')
    worksheet.col(0).width = 4000
    worksheet.write(1,0, label = '学号')
    row = 2
    for k in Data.keys():
        worksheet.write(row,0, label = k)
        for i in range( len(Data[k]) ):
            worksheet.write(row,i+1, label = Data[k][i])
        row += 1
    workbook.save('final.xls')
至此,程序的静态部分完成。
为了方便起见,程序从命令行启动时可以接收不定长的参数,这些参数就是各次成绩数据表的文件名。需要使用sys.argv来访问命令行启动时程序接受的参数
books = []

for i in range(1, len(sys.argv) ):
    print("正在加载: {}".format(sys.argv[i]))
    books.append(sys.argv[i])

print("\n")
调用读取函数来依次处理表中的数据
for i in books:
    print("正在处理: {}".format(i))
    book = xlrd.open_workbook(i)
    sheet = book.sheets()[0]
    dataReader(sheet)
    print("{} 处理完成!\n".format(i))
最后调用写入函数来保存结果
print("正在链接并生成表格")
dataWriter()
print("完成!\n")
print("按回车结束...")
input()
在制作完这个简单的程序之后,需要我们去启动它。使用方法很简单,命令行启动,命令行参数为各次作业的excel文件。在这需要提醒,请务必将导出的excel文件更名为由数字或英文组成的文件名。对于历次作业,我们需要按照时间顺序输入参数

现在,已经获得了一个由数次作业合并的总体成绩表了。下一步则是生成千帆竞发图

生成千帆竞发图

对于生成出的总体成绩表,仍然需要一些处理。首先是将所有的成绩为NULL的分数,替换为0分

ctrl+F 调出查找界面,选择替换。查找内容为NULL,替换内容为0,选择全部替换

完成替换后,需要执行excel函数来生成数据。在原始数据不远处选择空闲列,输入excel函数,例如

输入完excel函数后,鼠标放到该单元格右下角,待鼠标变为黑色实心十字后,垂直向下拖拽至最后一个数据,例如

至此你完成了一列数据的生成。然后进行第二列数据的生成,输入excel函数,例如

执行与上一次相同的拖拽操作,例如

你已经生成两列数据了。在此过程中你可以发现规律,假若第一列函数是=B3,则第二列是=B3+C3,若需要第三列则是=B3+C3+D3等等,以此类推。
下面我们需要生成千帆竞发图。在你生成的数据头部加上次数,然后选取所有你生成的数据,例如

然后选择插入-折线图-带数据的折线图,例如

你生成的数据可能如下图所示,并非你所想要的样式,需要调整

选择设计-数据-切换行/列

此时生成千帆竞发图了

posted @ 2020-09-16 15:18  Pangan  阅读(374)  评论(0编辑  收藏  举报