前端导出excel能问题(npm的xlsx前端导出excel怎么合并单元格呢)

seosqwseo7个月前 (06-15)测评日记54

一、关于前端如何导出后台传来的excel接口

1、题主所说的导出指的是让前端去**后台的Excel还时还要有其他*作呢?

2、如果单纯去**,可以基于XMLHttpRequest请求,请求一个服务器或者后端的Excel文件,然后设置responseType为blob二进制流来传输。例如:

3、var excelFilePath='resources/Excel/importExcel.xlsx';

4、var xhr= new XMLHttpRequest();

5、xhr.open('GET', excelFilePath, true);

6、xhr.responseType='blob';

7、之后onload里面的blob就是这个Excel文件的二进制流,接下来只要将blob转成文件进行**就可以了,JS中有很多开源的第三方类库可以做到,例如filesaver。如果是用filesaver的话,调用其中的saveAs方法就可以将该blob转成对应文件进行**

8、把上述方法加到onload方法中,前端就会**一个名为test.xlsx的Excel文件,内容就是后端传过来的Excel

9、如果还要有其他*作例如展示或者**的编辑,就需要一些第三方控件来完成了,比如SpreadJS

10、上述的方法也是在他们的官方论坛中学到的,参考**:

二、前端怎么实现导出excel内容是数值

1、在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL,我这里就给大家介绍下^_^。

2、首先我们来导出EXCEL格式的文件吧。现在主流的*作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里用Apache POI!先去Apache的大本营**POI的jar包:

3、首先进入poi的**,**需要的jar包,如图所示,**zip包

4、其次,将**的zip包解压,并将根目录、lib目录和ooxml-lib目录下的jar包放入工程目录的lib文件中(下一步会说明具**置)。

5、然后,新建javaweb项目,例如poi-micro项目,将上面的jar包**到poi-micro\WebContent\WEB-INF\lib目录下,实际上上面的jar包放在本机的固定文件夹中即可,在build path时倒入进去就OK了。

6、导出的excel表格的每一行可抽象成一个实体类,例如,导出学生信息excel表格,则一行记录表示一个学生的信息。以此为例,则需要新建学生实体类Student,如图示。该类有一些属性两个构造方法和get/set方法组成。

7、下面,编写导出excel表格的功能实现类了,为了该类具有通用型,使用泛型和反射机制,安装属性的顺序输出实体类的属性信息。

8、后编写测试方法,在main方法中新建几个学生对象,调用上面的excel表格导出类的方法即可。

三、npm的xlsx前端导出excel怎么合并单元格呢

创建@/vendor/Export2Excel.js:

require('script-loader!file-saver');

require('script-loader!@/vendor/Blob');//在vendor文件加下建立Blob.js,代码在下方

return(epoch-newDate(Date.UTC(1899,11,30)))/(24*60*60*1000);

functionsheet_from_array_of_arrays(data,opts){

varrange={s:{c:10000000,r:10000000},e:{c:0,r:0}};

for(varR=0;R!=data.length;++R){

for(varC=0;C!=data[R].length;++C){

if(range.s.r>R)range.s.r=R;

if(range.s.c>C)range.s.c=C;

varcell_ref=XLSX.utils.encode_cell({c:C,r:R});

if(typeofcell.v==='number')cell.t='n';

elseif(typeofcell.v==='boolean')cell.t='b';

if(range.s.c<10000000)ws['!ref']=XLSX.utils.encode_range(range);

if(!(thisinstanceofWorkbook))returnnewWorkbook();

varbuf=newArrayBuffer(s.length);

for(vari=0;i!=s.length;++i)view[i]=s.charCodeAt(i)&0xFF;

//在tableData数据中对colName列进行加工(header:['xx','yy',...],mergeRule:[2,1,1,3,2,1...])

//返回格式newTableDatas=[[列头s],["abc","ss","yyy",0],[null,"xx","y",1],["bca","xxx","yy",1],[null,"xxx","yy",1]]

//返回格式newMergeRules=[{"e":{"r":2,"c":0},"s":{"r":1,"c":0}},{"e":{"r":4,"c":0},"s":{"r":3,"c":0}}]

functionformatTableData(header,tableDatas,mergeRules,colIndex,colName){

varnewTableDatas=[header]//第一行为列头,

varnewMergeRules=[]//加工合并规则

varcurrRowIndex=1//因为第一行为列头所以起始为1

varmergeIndexs=[currRowIndex]//因为第一行为列头所以起始为1,为创建newTableDatas使用

varendRowIndex=currRowIndex+mergeRules[i]-1

varmerge={"e":{"r":endRowIndex,"c":colIndex},"s":{"r":currRowIndex,"c":colIndex}}

currRowIndex=currRowIndex+mergeRules[i]

mergeIndexs.push(currRowIndex)

if(mergeIndexs.indexOf(i+1)===-1){

currRow[colName]=null//合并的数据但不是第一行时,此列赋值null

return[newTableDatas,newMergeRules]

exportfunctionexport_data_to_excel(header,tableDatas,mergeRules,colIndex,colName,excelName){

varoo=formatTableData(header,tableDatas,mergeRules,colIndex,colName);

varwb=newWorkbook(),ws=sheet_from_array_of_arrays(data);

//ws['!cols']=['apple','banan'];

varwbout=XLSX.write(wb,{bookType:'xlsx',bookSST:false,type:'**nary'});

saveAs(newBlob([s2ab(wbout)],{type:"application/octet-stream"}),excelName+".xlsx")

view.URL=view.URL||view.webkitURL;

if(view.Blob&&view.URL){

//InternallyweuseaBlobBuilderimplementationtobaseBloboffof

//inordertosupportolderbrowsersthatonlyhaveBlobBuilder

varBlobBuilder=view.BlobBuilder||view.WebKitBlobBuilder||view.MozBlobBuilder||(function(view){

returnObject.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];

,FakeBlobBuilder=functionBlobBuilder(){

,FakeBlob=functionBlob(data,type,encoding){

,FBB_proto=FakeBlobBuilder.prototype

,FileReaderSync=view.FileReaderSync

,FileException=function(type){

this.code=this[this.name=type];

"NOT_FOUND_ERRSECURITY_ERRABORT_ERRNOT_READABLE_ERRENCODING_ERR"

+"NO_MODIFICATION_ALLOWED_ERRINVALID_STATE_ERRSYNTAX_ERR"

,file_ex_code=file_ex_codes.length

,real_URL=view.URL||view.webkitURL||view

,real_create_object_URL=real_URL.createObjectURL

,real_revoke_object_URL=real_URL.revokeObjectURL

FakeBlob.fake=FB_proto.fake=true;

FileException.prototype[file_ex_codes[file_ex_code]]=file_ex_code+1;

if(!real_URL.createObjectURL){

URL.createObjectURL=function(blob){

type="application/octet-stream";

returndata_URI_header+";base64,"+blob.data;

}elseif(blob.encoding==="URI"){

returndata_URI_header+","+decodeURIComponent(blob.data);

returndata_URI_header+";base64,"+btoa(blob.data);

returndata_URI_header+","+encodeURIComponent(blob.data);

}elseif(real_create_object_URL){

returnreal_create_object_URL.call(real_URL,blob);

URL.revokeObjectURL=function(object_URL){

if(object_URL.substring(0,5)!=="data:"&&real_revoke_object_URL){

real_revoke_object_URL.call(real_URL,object_URL);

FBB_proto.append=function(data/*,endings*/){

if(Uint8Array&&(datainstanceofArrayBuffer||datainstanceofUint8Array)){

str+=String.fromCharCode(buf[i]);

}elseif(get_class(data)==="Blob"||get_class(data)==="File"){

bb.push(fr.readAsBinaryString(data));

//asyncFileReaderwon'tworkasBlobBuilderissync

thrownewFileException("NOT_READABLE_ERR");

}elseif(datainstanceofFakeBlob){

if(data.encoding==="base64"&&atob){

}elseif(data.encoding==="URI"){

bb.push(decodeURIComponent(data.data));

}elseif(data.encoding==="raw"){

data+="";//convertunsupportedtypestostrings

bb.push(unescape(encodeURIComponent(data)));

FBB_proto.getBlob=function(type){

returnnewFakeBlob(this.data.join(""),type,"raw");

FBB_proto.toString=function(){

FB_proto.slice=function(start,end,type){

this.data.slice(start,args>1?end:this.data.length)

view.Blob=functionBlob(blobParts,options){

vartype=options?(options.type||""):"";

for(vari=0,len=blobParts.length;i

}(typeofself!=="undefined"&&self||typeofwindow!=="undefined"&&window||this.content

链接:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

海信(Hisense)55英寸55E3G-PRO好用吗

海信(Hisense)55英寸55E3G-PRO好用吗

很多小伙伴在关注海信(Hisense)55英寸55E3G-PRO怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产...

创维创维电视75英寸75A3D质量好吗

创维创维电视75英寸75A3D质量好吗

很多小伙伴在关注创维创维电视75英寸75A3D怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

TCL雷鸟使用反馈分享

TCL雷鸟使用反馈分享

很多小伙伴在关注TCL雷鸟怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

海信电视98E7G-PRO质量怎么样

海信电视98E7G-PRO质量怎么样

很多小伙伴在关注海信电视98E7G-PRO怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

荣耀手环7全天候血氧监测好不好

荣耀手环7全天候血氧监测好不好

很多小伙伴在关注荣耀手环7全天候血氧监测怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

阿尔法蛋超能蛋智能机器人中英学习启蒙早教机好不好用

阿尔法蛋超能蛋智能机器人中英学习启蒙早教机好不好用

很多小伙伴在关注阿尔法蛋超能蛋智能机器人中英学习启蒙早教机怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一...