Greasy Fork is available in English.

GreatNJUjiaowu

南京大学教务网增强

// ==UserScript==
// @name       GreatNJUjiaowu
// @description 南京大学教务网增强
// @namespace  NJUjiaowu
// @match      *://elite.nju.edu.cn/jiaowu/student/studentinfo/achievementinfo.do*
// @grant      none
// @require    https://cdn.bootcss.com/jquery/3.4.1/jquery.slim.min.js 
// @require    https://cdn.bootcss.com/xlsx/0.15.1/xlsx.mini.min.js
// @author     Gerrard_Mao
// @version     1.0
// @license      MIT
// @supportURL https://github.com/yp51md/GreatNJUjiaowu
// ==/UserScript==
(function () {
    'use strict';
    //删除html标记	
    function delHtmlTag(str) {
        return str.replace(/<[^>]+>/g, "");
    }
    // 删除空格
    function delSpace(str) {
        return str.replace(/\s*/g, "");
    }

    function arr2workbook(arr) {
        var sheet = XLSX.utils.aoa_to_sheet(arr);
        var wb = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(wb, sheet, term);
        return wb;
    }
    
    // 将workbook装化成blob对象 参考 https://juejin.im/post/5d1dc5cbe51d45775f516ad0
    function workbook2blob(workbook) {
        // 生成excel的配置项
        var wopts = {
            // 要生成的文件类型
            bookType: "xlsx",
            // // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
            bookSST: false,
            type: "binary"
        };
        var wbout = XLSX.write(workbook, wopts);
        // 将字符串转ArrayBuffer
        function s2ab(s) {
            var buf = new ArrayBuffer(s.length);
            var view = new Uint8Array(buf);
            for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
            return buf;
        }
        var blob = new Blob([s2ab(wbout)], {
            type: "application/octet-stream"
        });
        return blob;
    }

    //array to excel and give download url
    function downloadExcel(courses) {
        var wb = arr2workbook(courses);
        var blob = workbook2blob(wb);
        var fileName = "成绩单.xlsx";
        if (typeof blob == "object" && blob instanceof Blob) {
            blob = URL.createObjectURL(blob); // 创建blob地址
        }
        var aLink = document.createElement("a");
        aLink.href = blob;
        aLink.download = fileName || "";
        aLink.click();
        URL.revokeObjectURL(blob);
    }
    
    //学期
    var divs = $("div");
    var term = delSpace(delHtmlTag(divs[7].innerHTML));
    
    //课程
    var courses = [];
    var tableHtml = $("table.TABLE_BODY tbody tr").each(function () {
        var arr = [];
        $(this).children().each(function () {
            arr.push(delSpace($(this).text()));
        });
        courses.push(arr);
    });
    
    //下载按钮
    var button=$( ":button" );
    var buttonText = '<input type="button" style="font-size:12px;border: #7b9ebd 1px solid;padding:1px;text-align:center;width:90px;" onClick="window.execute();" value="下载Excel"></input>';
    window.execute = function(){
        downloadExcel(courses);
    };
    button.after(buttonText);


})();