UNPKG

qq-excel

Version:
139 lines (122 loc) 4.6 kB
/** * Copyright(c) 2018 diyao * MIT Licensed */ var request = require('superagent') var cheerio = require('cheerio') /** * * @param {string} url 在线表格地址 * @param {fun} done 回调函数,传入你处理好的原始数据。 */ var parseOnlineExcel = function (url, options, done) { request .get(url) .end((err, res) => { if (err) { throw TypeError('parseOnlineExcel err:' + err) } // 取到内联脚本,转为变量 var $ = cheerio.load(res.text) var dataString = $('#dataClientVarsContent').find('script').html() eval(dataString) // 取出globalpadid,用于可能的取其他sheet参数 var globalPadId = clientVars.collab_client_vars.globalPadId // 取出xsrf参数值 var xsrf = $('#reconnectform').find('[name=xsrf]').val() // 取出变量中,带有表格数据的那一个 var dataArr = unescape(clientVars.collab_client_vars.initialAttributedText.text).split("\n").filter(function(val, index, arr){ return val.length > 0 && "[" === val[0] }) var data = JSON.parse(dataArr[0])[0] // sheet列表,每一项构成{id: bb89, name: 工作表},id是url-hash值 var sheetList = clientVars.collab_client_vars.header[0].d // options.sheet可以是序号(1开始),可以使hash值(必须#号开始),也可以是sheet名字 // 返回sheet的序号。 var sheet = getSheetIndex(sheetList, options) if (sheet === 1) { // 取出真实交给底层处理的二维数组结构。这个data是sheet为1的情况。 var excelMatrixArr = excelMatrixArrFromDomDate(data) if (typeof done === 'function') { done(excelMatrixArr) } }else{ // 接口地址 var getSheetUrl = 'https://docs.qq.com/dop-api/get/sheet?' + 'padId=' + globalPadId + '&subId=' + sheetList[--sheet]['id'] + '&xsrf=' + xsrf; // 设置一些头,绕过其校验。 request .get(getSheetUrl) .set('referer', url) .set('x-requested-with', 'XMLHttpRequest') .end((err, res) => { if (err) { throw TypeError('parseOnlineExcel err:' + err) } var sheetDate = unescape(JSON.parse(res.text).data.initialAttributedText.text).split("\n").filter(function (val, index, arr) { return val.length > 0 && "[" === val[0] }); sheetDate = JSON.parse(sheetDate[0])[0] // 取出真实交给底层处理的二维数组结构。这个data是sheet为1的情况。 var excelMatrixArr = excelMatrixArrFromDomDate(sheetDate) if (typeof done === 'function') { done(excelMatrixArr) } }) } }) } /** * * @param {array} sheetList sheet列表 * @param {object} options 。 */ var getSheetIndex = function (sheetList, options) { var sheet = options.sheet; var len = sheetList.length // index hash name var sheetType = 'index' if (typeof +sheet === 'number') { sheetType = 'index' sheet = +sheet }else if (sheet.indexOf('#') === 0) { // hash sheetType = 'id' sheet = sheet.slice(1) }else{ sheetType = 'name' } if (sheetType === 'id' || sheetType === 'name') { for (var i = 0; i < len; i++) { if (sheetList[i][sheetType] === sheet) { sheet = i + 1 break; } }; } return +sheet } /** * * @param {object} domDate 谷歌在线表格抓出的object数据。返回为excel模块的基础二维数组数据。 */ var excelMatrixArrFromDomDate = function (domDate) { var datasArr = domDate.changes, colcowInfo = domDate.range.to, col = colcowInfo.col + 1, cow = colcowInfo.row + 1, result = [],i, j, item; for (i = 0; i < cow; i++) { item = [] for (j = 0; j < col; j++) { item[j] = datasArr[i * col + j][3] === null ? "" : datasArr[i * col + j][3] } result.push(item) } return result } var qqExcel = function () { return ['docs.qq.com', parseOnlineExcel] }() module.exports = qqExcel;