UNPKG

@asasugar-use/custom-json2excel

Version:

✌传入json,可自定义表格标题名称和列数、头部名称、过滤列和绑定生成开始与成功的回调函数

1 lines 6.02 kB
import*as t from"xlsx";import*as e from"papaparse";let r=Object.prototype.toString;function o(t){return null!==t&&"[object Object]"===r.call(t)}class s{data;scope;orderedKey;filters;title;footer;keyMap;name;type;onStart;onSuccess;onError;constructor({data:t=[],scope:e={},orderedKey:r=[],filters:o=[],title:s=[],footer:n=[],keyMap:l={},name:i="excel",type:a="xls",onStart:h=()=>{},onSuccess:c=()=>{},onError:f=t=>{console.log(t)}}){this.data=t,this.scope=e,this.filters=o,this.footer=n,this.orderedKey=r,this.keyMap=l,this.name=i,this.title=s,this.type=a,this.onStart=h,this.onSuccess=c,this.onError=f}generate(){if(!this.data||!this.data.length){this.onError&&this.onError();return}this.onStart&&this.onStart();let t=this._getProcessedJson(this.data);return(t=this._toChsKeys(t),"csv"==this.type)?this._export(this._jsonToCSV(t),`${this.name}.${this.type}`,"application/csv"):this._export(this._jsonToXLS(t),`${this.name}.${this.type}`,"application/vnd.ms-excel")}_getObjLastValue(t,e){if(o(e)){let r=Object.keys(e)[0],o=Object.values(e)[0];return this._getObjLastValue(t[r],o)}return t[e]}_toChsKeys(t){return t.map(t=>{let e={};if(this.orderedKey&&this.orderedKey.length)for(let r of this.orderedKey)e[r]=t[r];if(this.filters&&this.filters.length)for(let t of this.filters)delete e[t];if(this.scope&&Object.keys(this.scope).length){let r=Object.keys(e).length?e:t;for(let t in r)this.scope.hasOwnProperty(t)?e[t]=this._getObjLastValue(r[t],this.scope[t]):e[t]=r[t]}if(this.keyMap&&Object.keys(this.keyMap).length){let r=Object.keys(e).length?e:t;for(let t in r)this.keyMap.hasOwnProperty(t)&&(e[this.keyMap[t]]=r[t],delete r[t])}return Object.keys(e).length?e:t})}_download(t,e){if(window.navigator&&window.navigator.msSaveOrOpenBlob)window.navigator.msSaveOrOpenBlob(t,e);else{let r=document.createElement("a"),o=window.URL.createObjectURL(t);r.href=o,r.setAttribute("download",e),r.innerHTML="downloading...",r.style.display="none",document.body.appendChild(r),setTimeout(()=>{r.click(),document.body.removeChild(r),setTimeout(()=>{self.URL.revokeObjectURL(r.href)},250)},66)}}_export(t,e,r){new Promise(o=>{let s;s=t&&/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(t)?function(t,e){try{if("string"!=typeof t)throw Error("Input data must be a string");let r=window.btoa(t),o=r.length,s=new Uint8Array(o);for(let t=0;t<o;t++)s[t]=r.charCodeAt(t);return new Blob([s],{type:e})}catch(t){throw console.error("Error converting Base64 to Blob:",t),t}}(t,r):function(t,e){try{if("string"!=typeof t)throw Error("Input data must be a string");let r=new TextEncoder().encode(t);return new Blob([r],{type:e})}catch(t){throw console.error("Error converting string to Blob:",t),t}}(t,r),o(this._download(s,e))}).then(()=>{this.onSuccess&&this.onSuccess()}).catch(t=>{this.onError&&this.onError(t)})}_jsonToXLS(t){let e="<thead><tr>";if(this.title&&this.title.length){for(let t of this.title)e+=`<th colspan=${t.colspan}>${t.name}`;e+="<th></tr>"}for(let r in t[0])e+="<th>"+r+"</th>";if(e+="</tr></thead><tbody>",t.map(t=>{for(let r in e+="<tbody><tr>",t)e+=`<td>${t[r]}</td>`;e+="</tr></tbody>"}),this.footer&&this.footer.length){for(let t of(e+="<tfooter><tr>",this.footer))e+=`<th colspan=${t.colspan}>${t.name}`;e+="<th></tr></tr></tfooter>"}return'<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=ProgId content=Excel.Sheet> <meta name=Generator content="Microsoft Excel 11"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\x3c!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--\x3e<style type="text/css">td{mso-number-format:@;}</style></head><body><table>${table}</table></body></html>'.replace("${table}",e)}_jsonToCSV(t){var e="";if(this.title&&this.title.length){for(let t of this.title)e+=`${t.name}`;e+="\r\n"}for(let r in t[0])e+=r+",";if(e=e.slice(0,e.length-1)+"\r\n",t.map(t=>{for(let r in t){let o=t[r]+"";o.match(/[,"\n]/)&&(o='"'+o.replace(/\"/g,'""')+'"'),e+=o+","}e=e.slice(0,e.length-1)+"\r\n"}),this.footer&&this.footer.length){for(let t of this.footer)e+=`${t.name}`;e+="\r\n"}return e}_getProcessedJson(t){let e=this._getKeys(t),r=[];return t.map(t=>{let o={};for(let r in e){let s=e[r];o[r]=this._getNestedData(s,t)}r.push(o)}),r}_getKeys(t){let e={};for(let r in t[0])e[r]=r;return e}_getNestedData(t,e){var r;let s=o(t)?t.field:t,n=null,l=`${s}`.split(".");n=e[l[0]];for(let t=1;t<l.length;t++)n=n[l[t]];return void 0!==(r=n=this._callItemCallback(t,n))&&null!==r?n:""}_callItemCallback(t,e){return o(t)&&"function"==typeof t.callback?t.callback(e):e}}async function n(r){return await new Promise((o,s)=>{r instanceof File||s(Error("RawFile must be file"));let n=new FileReader;"application/vnd.ms-excel"===r.type||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"===r.type?(n.onload=async e=>{try{let r=e.target?.result;r||s(Error("No data"));let n=(0,t.read)(r,{type:"array",cellDates:!0}),l=function(e){let r=[];for(let o of e.SheetNames){let s=e.Sheets[o],n=function(e){if(!e||!e["!ref"])return[];let r=[],o=t.utils.decode_range(e["!ref"]),s=o.s.r;for(let n=o.s.c;n<=o.e.c;++n){let o=e[t.utils.encode_cell({c:n,r:s})],l="UNKNOWN "+n;o&&o.t&&(l=t.utils.format_cell(o)),r.push(l)}return r}(s),l=t.utils.sheet_to_json(s,{raw:!0});r.push({header:n,results:l,meta:{sheetName:o}})}return r}(n);o(l)}catch(t){s(t)}},n.readAsArrayBuffer(r)):"text/csv"===r.type&&(n.onload=async t=>{try{let r=t.target?.result;r||s(Error("No data")),"string"!=typeof r&&s(Error("Invalid data type"));let n=(0,e.parse)(r,{header:!0}),l=function(t){let e=t.meta.fields??[],r=t.data.filter(t=>Object.keys(t).length===e.length);return[{header:e,results:r,meta:{sheetName:"Sheet1"}}]}(n);o(l)}catch(t){s(t)}},n.readAsText(r))})}export{s as JsonToExcel,n as excelToJson};