json-key-string-xlsx
Version:
Convert between json and xlsx files by key string in a browser or NodeJS.
6 lines • 7.71 kB
JavaScript
/*!
* json-key-string-xlsx v1.4.1
* (c) 2019-2021 jobyrao<raojianb@mail2.sysu.edu.cn>
* Released under the MIT License.
*/
;function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function r(e){return function(e){if(Array.isArray(e))return n(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||a(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){if(e){if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=new Array(t);r<t;r++)a[r]=e[r];return a}function o(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=a(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,i=!0,l=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return i=e.done,e},e:function(e){l=!0,s=e},f:function(){try{i||null==r.return||r.return()}finally{if(l)throw s}}}}var s=require("xlsx"),i=function(){function a(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a)}var n,i,l;return n=a,l=[{key:"switch2customStructure",value:function(e){for(var t=0,r=e.length;t<r;t+=1)e[t].data=a.rotateMatrix(e[t].data),e[t].data[0]=a.fillCellMerge(e[t].data[0])}},{key:"rotateMatrix",value:function(e){var t=[],r=[];e.forEach((function(e){r.push(e.length)}));for(var a=0,n=Math.max.apply(null,r);a<n;a+=1){for(var o=[],s=0,i=e.length;s<i;s+=1)o[s]=e[s][a];t.push(o)}return t}},{key:"fillCellMerge",value:function(e){for(var t=0,r=e.length;t<r;t+=1)void 0===e[t]||e[t].trim&&""===e[t].trim()?0===t?(console.warn("The first line of the json-attribute description value is forbidden to be null."),e[t]="firstLineAttrDesc"):e[t]=e[t-1]:e[t]=e[t].toString().replace(/\s/g,"");return e}},{key:"isRequire",value:function(e){return/(.*)\#require\([\'\"]*([^\'\"]+)[\'\"]*\)/gi.exec(e)}}],(i=[{key:"parse",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a="string"==typeof e?"readFile":"read",n=s[a](e,t),i=[],l=n.SheetNames;t.entry&&l.includes(t.entry)||(t.entry=l[0]);var c=t.sheets||l;c instanceof Array&&(c.unshift(t.entry),c=r(new Set(c)));var u,y=o(c);try{for(y.s();!(u=y.n()).done;){var f=u.value,h=n.Sheets[f];i.push({sheetName:f,data:s.utils.sheet_to_json(h,{header:1,raw:!0,cellDates:!0})})}}catch(e){y.e(e)}finally{y.f()}for(var p=0,v=i.length;p<v;p+=1)for(var d=i[p].data,b=0;b<d.length;b+=1)0===d[b].length&&(d.splice(b,1),b-=1);if(/\ufffd/.test(JSON.stringify(i)))throw new Error("Exceptional characters are found!");return i}},{key:"parse2json",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.zeroCorrection(),this.parsedXlsxData=this.parse(e,t),a.switch2customStructure(this.parsedXlsxData);var r=this.convertProcess(this.parsedXlsxData[0].data);return r}},{key:"zeroCorrection",value:function(){this.parse2jsonDataCache=[],this.parse2jsonCover=new Set}},{key:"analysisAttrDesc",value:function(e){var t=e.match(/\[(\d+)\]$/);return Array.isArray(t)?[!0,e.split("[")[0],+t[1]]:"[]"===e.slice(-2)?[!0,e.slice(0,-2),null]:[!1,e,null]}},{key:"createJsonEnumCol",value:function(t,r,n,o,s,i){if(""!==r){if("object"!==e(r)&&(r=r.split(".")),0===r.length)return t;var l=r.shift(),c=a.isRequire(l);if(c){l=c[1];var u=this.getParsedXlsxDataIndex(c[2]),y=this.parsedXlsxData[u].data;return y=this.convertProcess(y,u)[o],this.createJsonEnumCol(t,l,y,o,s,u)}var f=this.analysisAttrDesc(l),h=f[0],p=f[1],v=f[2],d=0===r.length;if(h){if(void 0===t[p]?t[p]=[]:Array.isArray(t[p])||(this.collectCoverKey(i,s),t[p]=[]),null===v)t[p].push(d?n||"":{});else if(d&&void 0!==t[p][v]&&this.collectCoverKey(i,s),d)t[p][v]=n||"";else{var b=t[p][v],m="object"===e(b)?b:{};t[p][v]=Object.assign({},m)}var g=v||t[p].length-1;return this.createJsonEnumCol(t[p][g],r,n,o,s,i)}return void 0===t[p]?t[p]=d?n||"":{}:"[object Object]"!==Object.prototype.toString.call(t[p])?(this.collectCoverKey(i,s),t[p]=d?n||"":{}):d&&(this.collectCoverKey(i,s),t[p]=n||""),this.createJsonEnumCol(t[p],r,n,o,s,i)}}},{key:"convertProcess",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=[];if(this.parse2jsonDataCache[t])return this.parse2jsonDataCache[t];for(var a=e[0].concat(),n=1,o=e.length;n<o;n+=1){for(var s=e[n],i={},l=0,c=s.length;l<c;l+=1)this.createJsonEnumCol(i,a[l],s[l],n-1,l,t);r.push(i)}return this.parse2jsonDataCache[t]=r,r}},{key:"getParsedXlsxDataIndex",value:function(e){var t;if("number"==typeof+e&&+e<this.parsedXlsxData.length)return+e;for(var r=0,a=this.parsedXlsxData.length;r<a;r+=1)if(e===this.parsedXlsxData[r].sheetName){t=r;break}if(void 0===t)throw new Error("'required' parameter is not valid: There is no such 'sheet': ".concat(e));return t}},{key:"collectCoverKey",value:function(e,t){var r=this.parsedXlsxData[e].sheetName,a=this.parsedXlsxData[e].data[0][t],n='sheet name "'.concat(r,'", row ').concat(t+1,', value "').concat(a,'"');this.parse2jsonCover.add(n)}},{key:"json2XlsxByKey",value:function(e,t){this.keyStack=[];var a=[];if(a=Array.isArray(e)?this.object2XlsxByKey.apply(this,r(e)):this.object2XlsxByKey(e),t){var n={Sheets:{Sheet1:s.utils.aoa_to_sheet(a)},SheetNames:["Sheet1"]};if("string"==typeof t&&s.writeFile(n,t),"array"===t.type)return s.write(n,{bookType:"xlsx",bookSST:!1,type:"array"})}return a}},{key:"object2XlsxByKey",value:function(){for(var t=this,a=[],n=arguments.length,o=new Array(n),s=0;s<n;s++)o[s]=arguments[s];var i=o[0];if(Array.isArray(i)){for(var l=function(n,s){if("object"!==e(i[n])){var l=t.getPreKeyStr();a.push(["".concat(l,"[").concat(n,"]")].concat(r(o.map((function(e){return e[n]})))))}else t.keyStack.push({keyName:"[".concat(n,"]"),type:"array"}),a.push.apply(a,r(t.object2XlsxByKey.apply(t,r(o.map((function(e){return e[n]}))))))},c=0,u=i.length;c<u;c++)l(c,u);this.keyStack.pop()}else!function(){for(var n=Object.keys(i),s=function(s,l){if("object"!==e(i[n[s]])){var c=t.getPreKeyStr();a.push([(c&&c+".")+n[s]].concat(r(o.map((function(e){return e[n[s]]})))))}else t.keyStack.push({keyName:n[s],type:"object"}),a.push.apply(a,r(t.object2XlsxByKey.apply(t,r(o.map((function(e){return e[n[s]]}))))))},l=0,c=n.length;l<c;l++)s(l);t.keyStack.pop()}();return a}},{key:"getPreKeyStr",value:function(){var e="";if(!this.keyStack.length)return e;for(var t=0,r=this.keyStack.length;t<r;t++)t<r-1&&"object"===this.keyStack[t+1].type?e+=this.keyStack[t].keyName+".":e+=this.keyStack[t].keyName;return e}}])&&t(n.prototype,i),l&&t(n,l),a}(),l=new i;Object.defineProperties(i,{parse:{value:l.parse.bind(l)},parse2json:{value:l.parse2json.bind(l)},parse2jsonDaTa:{value:l.parse2jsonDaTa},parse2jsonCover:{value:l.parse2jsonCover},parsedXlsxData:{value:l.parsedXlsxData}}),module.exports=i;