qq-excel
Version:
qq excel online
139 lines (122 loc) • 4.6 kB
JavaScript
/**
* 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;