json-key-string-xlsx
Version:
Convert between json and xlsx files by key string in a browser or NodeJS.
6 lines • 7.7 kB
JavaScript
/*!
* json-key-string-xlsx v1.4.1
* (c) 2019-2021 jobyrao<raojianb@mail2.sysu.edu.cn>
* Released under the MIT License.
*/
import e from"xlsx";function t(e){return(t="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})(e)}function r(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 a(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||n(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 n(e,t){if(e){if("string"==typeof e)return o(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)?o(e,t):void 0}}function o(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 s(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=n(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var a=0,o=function(){};return{s:o,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},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 i=function(){function n(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n)}var o,i,l;return o=n,l=[{key:"switch2customStructure",value:function(e){for(var t=0,r=e.length;t<r;t+=1)e[t].data=n.rotateMatrix(e[t].data),e[t].data[0]=n.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(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="string"==typeof t?"readFile":"read",o=e[n](t,r),i=[],l=o.SheetNames;r.entry&&l.includes(r.entry)||(r.entry=l[0]);var c=r.sheets||l;c instanceof Array&&(c.unshift(r.entry),c=a(new Set(c)));var u,y=s(c);try{for(y.s();!(u=y.n()).done;){var f=u.value,h=o.Sheets[f];i.push({sheetName:f,data:e.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),n.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(e,r,a,o,s,i){if(""!==r){if("object"!==t(r)&&(r=r.split(".")),0===r.length)return e;var l=r.shift(),c=n.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(e,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===e[p]?e[p]=[]:Array.isArray(e[p])||(this.collectCoverKey(i,s),e[p]=[]),null===v)e[p].push(d?a||"":{});else if(d&&void 0!==e[p][v]&&this.collectCoverKey(i,s),d)e[p][v]=a||"";else{var b=e[p][v],m="object"===t(b)?b:{};e[p][v]=Object.assign({},m)}var g=v||e[p].length-1;return this.createJsonEnumCol(e[p][g],r,a,o,s,i)}return void 0===e[p]?e[p]=d?a||"":{}:"[object Object]"!==Object.prototype.toString.call(e[p])?(this.collectCoverKey(i,s),e[p]=d?a||"":{}):d&&(this.collectCoverKey(i,s),e[p]=a||""),this.createJsonEnumCol(e[p],r,a,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(t,r){this.keyStack=[];var n=[];if(n=Array.isArray(t)?this.object2XlsxByKey.apply(this,a(t)):this.object2XlsxByKey(t),r){var o={Sheets:{Sheet1:e.utils.aoa_to_sheet(n)},SheetNames:["Sheet1"]};if("string"==typeof r&&e.writeFile(o,r),"array"===r.type)return e.write(o,{bookType:"xlsx",bookSST:!1,type:"array"})}return n}},{key:"object2XlsxByKey",value:function(){for(var e=this,r=[],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"!==t(i[n])){var l=e.getPreKeyStr();r.push(["".concat(l,"[").concat(n,"]")].concat(a(o.map((function(e){return e[n]})))))}else e.keyStack.push({keyName:"[".concat(n,"]"),type:"array"}),r.push.apply(r,a(e.object2XlsxByKey.apply(e,a(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"!==t(i[n[s]])){var c=e.getPreKeyStr();r.push([(c&&c+".")+n[s]].concat(a(o.map((function(e){return e[n[s]]})))))}else e.keyStack.push({keyName:n[s],type:"object"}),r.push.apply(r,a(e.object2XlsxByKey.apply(e,a(o.map((function(e){return e[n[s]]}))))))},l=0,c=n.length;l<c;l++)s(l);e.keyStack.pop()}();return r}},{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}}])&&r(o.prototype,i),l&&r(o,l),n}(),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}});var c=i;export default c;