由于项目中用到了spreadjs(葡萄城的excel控件),之前做的测试缺少两个主要功能:
- 从 java 服务端导入excel 文件直接在浏览器页面展开不通过先下载再展开的方法(由于先下载再打开会出现多次现在加载等问题);
- 在网页上加载完之后修改了样式、内容等操作,需要保存到 java 服务端
准备工作:
- 安装葡萄城的spreadjs库;联网的话直接使用:$ npm install @grapecity/spread-sheets-vue 或者直接参考官网地址:
https://demo.grapecity.com.cn/spreadjs/help/docs/UsingSpread.SheetswithVue.html;离线情况下直接把在线状态的
安装包拷贝到离线的PC上修改package.json文件即可 - java后台接口(需要按照文件流的格式传输即可)
开始(直接上代码):
<template>
<div class="sroot">
<div class="top" id="workbook">
<gc-spread-sheets
@workbookInitialized='initSpread($event)'
:hostClass='"spreadHost"'>
</gc-spread-sheets>
</div>
<div class="foot">
<input type="file" id="loadfile" style="100px" @change="loadExcelChange">
<el-button type="primary" @click="importEvent" plain size="mini">导入</el-button>
<el-button type="primary" @click="saveDataToServeEvent" plain size="mini">保存到服务器</el-button>
<el-button type="primary" @click="dataFromServeEvent" plain size="mini">从服务端加载数据</el-button>
</div>
<form name="myform" id="myform" enctype="multipart/form-data" method="post"></form>
</div>
</template>
<script>
import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2016colorful.css';
import GC from '@grapecity/spread-sheets';
import '@grapecity/spread-sheets-vue';
import '@grapecity/spread-sheets-resources-zh';
import '@grapecity/spread-sheets-charts';
import {IO} from '@grapecity/spread-excelio';
GC.Spread.Common.CultureManager.culture('zh-cn');
import {
upload,
download
} from '@/request/api';
export default{
components:{
},
props:{
},
data(){
return{
importFile:null,
workbook:null,
excelIO:null,
fileName:''
}
},
created(){
},
mounted(){
console.log(`come in mounted!!!`);
this.excelIO=new IO();
},
methods:{
dataFromServeEvent(){
console.log(`come in dataFromServeEvent!!!`);
let str='_[]test 测试.xlsx';
this.fileName=str;
download({name:str}).then(res=>{
console.log(`下载excel!!!`);
let blob = new Blob([res.data], { type: "application/octet-stream" });
let spread=this.workbook;
let io=this.excelIO;
let file=this.importFile;
io.open(blob,
function(json){
let obj=json;
spread.fromJSON(obj);
}
)
}).catch(error=>{
console.log(error);
});
},
loadExcelChange(){
this.importFile=document.getElementById('loadfile').files[0];
},
initSpread(spread){
this.workbook=spread;
},
importEvent(){
console.log(`come in importEvent!!!`);
if(!this.importFile){
alert('请先选择导入的xxx.xlsx文件');
return;
}
let spread=this.workbook;
let io=this.excelIO;
let file=this.importFile;
io.open(file,
function(json){
let obj=json;
spread.fromJSON(obj);
}
)
},
saveDataToServeEvent(){
let spread=this.workbook;
let io=this.excelIO;
let fileStr=this.fileName;
console.log(`come in saveDataToServeEvent!!!`);
var json=spread.toJSON({includeBindingSource:true});
io.save(json,
function(blob){
var fd=new FormData(document.forms.namedItem('myform'));
fd.append('excelFile',blob);
fd.append('excelName',fileStr);
var xhr=new XMLHttpRequest();
xhr.onload=function(e){
console.log('完成');
};
xhr.onerror=function(error){
console.log('上传失败');
console.log(error);
};
xhr.open('POST','/dm02/spreadjsproAction/upload');
xhr.send(fd);
},
function(error){
console.log(error);
})
}
}
}
</script>
<style scoped lang='css'>
.sroot{
display: flex;
flex-direction: column;
100%;
height: 100%;
}
.spreadHost{
100%;
height:100%;
}
.top{
100%;
height:90%;
background-color: rgb(140, 236, 164);
}
.foot{
100%;
height: 10%;
background-color: rgb(133, 139, 224);
}
</style>
项目总结:从对项目需求对所做的项目进行一下个人的看法;spreadjs 作为前端项目的excel 插件的话,从上手难度,excel打开速度,展示效果看都是很不错的选择,不过也有
一些局限性:比如不支持导入的excel 中的表格里有斜线,列最大限度为256等问题,相对这些小问题最大问题就是成本问题,包含插件价格+部署价格;对比起来成
本远大于项目组预期成本,于是迫于成本问题直接选择 github 上的开源项目 lucksheet ,当然lucksheet也存在相同的局限问题,并且lucksheet的速度慢(改变不了),
对于大的excel文件有时候会崩溃的问题,需要从源码上进行优化;对于两者来说 spreadjs 相当于各种各样的车,根据你的需求选择不同的车就行了;而lucksheet 却
相当于各种各种车的零件,你需要根据你的需求选好车,然后在根据车来组装各种零件;