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

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

    生成千帆竞发图

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

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

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

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

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

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

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

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

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

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

    此时生成千帆竞发图了

  • 相关阅读:
    燃尽的一个不便之处修改
    jquery给元素添加样式表的方法
    http协议
    春节读书
    file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known
    jQuery on(),live(),trigger()
    jquery ui中的dialog,官网上经典的例子
    问题:循环元素,被选中元素个数,全选
    3.5星|《小学问》:年轻人思维与婚恋常见误区解析
    正念疗法入门介绍,作者是日籍美国正念疗法医生:3星|《高效休息法》
  • 原文地址:https://www.cnblogs.com/Heretic-Pangan/p/13679295.html
Copyright © 2011-2022 走看看