前端导出excel能问题(npm的xlsx前端导出excel怎么合并单元格呢)
一、关于前端如何导出后台传来的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
链接:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。