项目用到handsontable 插件 
根据官网 API写的handsontable初始化, 
数据展示, 
ajax请求, 
参数封装, 
Controller参数接受

全局容器

     var AllData = {};
var updatelist = [];
var delidslist =[];
var insertlist=[];

handsontable 的初始化

 function onIniHandsonTable(data) {
$('#hot').empty();
var hotElement = document.querySelector('#hot');
var hotSettings = {
data :data,
hiddenColumns: {
columns: [0],
indicators: true
},
columns : [
{
data:'id',
readOnly: true
},{
data:'ersystem',
type:'text'
},{
data:'concursystem',
type:'text'
},{
data:'apisystem',
type:'text'
},{
data:'myeven',
type:'text'
},{
data:'expresssum',
type:'text'
},{
data: 'todaydate',
type: 'date',
dateFormat: 'YYYY-MM-DD'
},{
data:'enddate',
type: 'date',
dateFormat: 'YYYY-MM-DD'
},{
data:'delayday',
type: 'text',
validator:/^[0-9]*$/
}
],
stretchH: 'all',
autoWrapRow: true,
rowHeaders: true,
colHeaders : [ 'ID', ' ERSystem ', ' ConcurSystem ','APISystem','MyEven','ExpressSum','TodayDate','EndDate','DelayDay' ],
columnSorting: true,
contextMenu:true,
sortIndicator: true,
dropdownMenu: ['filter_by_condition', 'filter_by_value','filter_action_bar'],
//dropdownMenu:true,
filters: true,
renderAllRows: true,
search: true, afterDestroy (){
// 移除事件
Handsontable.Dom.removeEvent(save, 'click', saveData);
loadDataTable();
},
beforeRemoveRow:function(index,amount){
var ids = [];
//封装id成array传入后台
if(amount!=0){
for(var i = index;i<amount+index;i++){
var rowdata = hot.getDataAtRow(i);
ids.push(rowdata[0]);
}
delExpressCount(ids);
screening();
}
}, afterChange:function(changes, source){
//params 参数 1.column num , 2,id, 3,oldvalue , 4.newvalue
var params =[];
if(changes!=null){
var index = changes[0][0];//行号码
var rowdata = hot.getDataAtRow(index);
params.push(rowdata[0]);
params.push(changes[0][1]);
params.push(changes[0][2]);
params.push(changes[0][3]); //仅当单元格发生改变的时候,id!=null,说明是更新
if(params[2]!=params[3]&&params[0]!=null){
var data={
id:rowdata[0],
ersystem:rowdata[1],
concursystem:rowdata[2],
apisystem:rowdata[3],
myeven:rowdata[4],
expresssum:rowdata[5],
todaydate:rowdata[6],
enddate:rowdata[7],
delayday:rowdata[8]
}
updateExpressCount(data);
}
}
}
} hot = new Handsontable(hotElement,hotSettings);
//数据导入
var button = {excel: document.getElementById('excelexport')};
var exportPlugin = hot.getPlugin('exportFile');
var rows = hot.countRows();
var cols = hot.countCols();
button.excel.addEventListener('click', function() {
exportPlugin.downloadFile('csv', {
filename: 'Expresscount'+'-'+getNowFormatDate(),
rowHeaders:false,
columnHeaders:true,
});
});
//数据导入
//插入的数据的获取
function insertExpressCount(){
var idsdata = hot.getDataAtCol(0);//所有的id
for(var i=0;i<idsdata.length;i++){
//id=null时,是插入数据,此时的i正好是行号
if(idsdata[i]==null){
//获得id=null时的所有数据封装进data
var rowdata = hot.getDataAtRow(i);
//var collength = hot.countCols();
if(rowdata!=null){
var data={
ersystem:rowdata[1],
concursystem:rowdata[2],
apisystem:rowdata[3],
myeven:rowdata[4],
expresssum:rowdata[5],
todaydate:rowdata[6],
enddate:rowdata[7],
delayday:rowdata[8]
}
insertlist.push(data);
}
}
}
if(insertlist.length!=0){
AllData.insertlist = insertlist;
} } saveData =function (){
//插入的数据的获取
insertExpressCount();
if(JSON.stringify(AllData) != "{}"&&validresult){
$.ajax({
url:'globalprocess',
type:'post',
dataType:'json',
contentType:'application/json',
data:JSON.stringify(AllData),
success:function(rdata){
if(rdata.success){
$.alert({
title: '消息提示',
type: 'blue',
content: '保存成功.',
});
//保存以后重置全局容器
clearContainer();
//销毁
hot.destroy();
}
else {
$.alert({
title: '错误提示',
type: 'red',
content: '保存数据失败.',
}); }
},
error:function () {
$.alert({
title: '错误提示',
type: 'red',
content: '请求失败.',
});
clearContainer();
}
})
}else{
if(!validresult){
$.alert({
title: '错误提示',
type: 'red',
content: '数据类型错误.',
});
}else{
$.alert({
title: '错误提示',
type: 'red',
content: '没有添加或修改数据.',
});
}
}
}
//绑定事件保存数据
Handsontable.Dom.addEvent(save, 'click', saveData);
}

删除list封装([ id1,id2,…])

 //删除的优先级最高
function delExpressCount (ids){
//传入的ids.length不可能为0
$.each(ids,function(index,id){
if(id!=null){
delidslist.push(id);
}
});
AllData.delidslist=delidslist;
}

删除的优先级别大于更新,如果一条数据被更新了又被删除了,事实上不需要执行更新操作的

 //updatelist数据更新
function screening(){
if(updatelist.length!=0&&delidslist.lentgh!=0){
for(var i=0;i<delidslist.length;i++){
for(var j=0;j<updatelist.length;j++){
if(updatelist[j].id == delidslist[i]){
//更新updatelist
updatelist.splice(j,1);
}
}
}
//把updatelist封装进AllData
AllData.updatelist=updatelist;
}
}

更新list封装([{expresscount1},…])

 //更新数据
function updateExpressCount(data){
if(JSON.stringify(data) != "{}"){
var flag = true;
//判断记录是否存在,更新数据
$.each(updatelist,function(index,node){
if(node.id==data.id){
//此记录已经有了
flag = false;
//用新得到的记录替换原来的,不用新增
updatelist[index] = data;
}
});
flag&&updatelist.push(data);
//封装
AllData.updatelist=updatelist;
}
}

清空全局容器

clearContainer =function (){
AllData = {};
updatelist = [];
delidslist =[];
insertlist=[];
}
 //获得当前时间
function getNowFormatDate() {
var date = new Date();
var seperator1 = "-";
var seperator2 = ":";
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
+ " " + date.getHours() + seperator2 + date.getMinutes()
+ seperator2 + date.getSeconds();
return currentdate;
}

加载用户数据,并绑定到handsontable

 function loadDataTable(){
showWait();
$.ajax({
url:'fillList',
type:'post',
dataType:'json',
success:function(rdata){
closeWait();
var convertData = [];
if (rdata && typeof rdata === "object") {
//重新封装数据,因为时间类型不符合要求
$.each(rdata,function(index,node){
convertData.push({
id:node.id,
myeven:node.myeven,
expresssum:node.expresssum,
ersystem:node.ersystem,
concursystem:node.concursystem,
apisystem :node.apisystem,
todaydate :common.timestampToDate(node.todaydate),
enddate:common.timestampToDate(node.enddate),
delayday:node.delayday
});
});
onIniHandsonTable(convertData);
}
else{
$.alert({
title: '消息提示',
type: 'red',
content: '加载数据失败.',
});
}
},
error:function(e,j,t){
closeWait();
$.alert({
title: '错误提示',
type: 'red',
content: '加载数据错误.',
});
console.log('express count/fill error:'+j+','+t);
}
});
}

对应的pojo类

 public class ExpressCount {
private Integer id; private Integer ersystem; private Integer concursystem; private Integer apisystem; private Integer myeven; private Integer expresssum; private Date todaydate; private Date enddate; private Integer delayday; private Date createdate; private Integer createuserid; private String createusername; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Integer getErsystem() {
return ersystem;
} public void setErsystem(Integer ersystem) {
this.ersystem = ersystem;
} public Integer getConcursystem() {
return concursystem;
} public void setConcursystem(Integer concursystem) {
this.concursystem = concursystem;
} public Integer getApisystem() {
return apisystem;
} public void setApisystem(Integer apisystem) {
this.apisystem = apisystem;
} public Integer getMyeven() {
return myeven;
} public void setMyeven(Integer myeven) {
this.myeven = myeven;
} public Integer getExpresssum() {
return expresssum;
} public void setExpresssum(Integer expresssum) {
this.expresssum = expresssum;
} public Date getTodaydate() {
return todaydate;
} public void setTodaydate(Date todaydate) {
this.todaydate = todaydate;
} public Date getEnddate() {
return enddate;
} public void setEnddate(Date enddate) {
this.enddate = enddate;
} public Integer getDelayday() {
return delayday;
} public void setDelayday(Integer delayday) {
this.delayday = delayday;
} public Date getCreatedate() {
return createdate;
} public void setCreatedate(Date createdate) {
this.createdate = createdate;
} public Integer getCreateuserid() {
return createuserid;
} public void setCreateuserid(Integer createuserid) {
this.createuserid = createuserid;
} public String getCreateusername() {
return createusername;
} public void setCreateusername(String createusername) {
this.createusername = createusername == null ? null : createusername.trim();
}
}

参数封装pojo类

 public class ExpressCountDataList {
List<ExpressCount> updatelist;
List<ExpressCount> insertlist;
List<Integer> delidslist; public List<ExpressCount> getUpdatelist() {
return updatelist;
}
public void setUpdatelist(List<ExpressCount> updatelist) {
this.updatelist = updatelist;
}
public List<ExpressCount> getInsertlist() {
return insertlist;
}
public void setInsertlist(List<ExpressCount> insertlist) {
this.insertlist = insertlist;
}
public List<Integer> getDelidslist() {
return delidslist;
}
public void setDelidslist(List<Integer> delidslist) {
this.delidslist = delidslist;
} }

Controller接收

 /**
* 保存编辑后table数据
* @param AllData(删除,更新,插入)
* @return
*/
@ResponseBody
@RequestMapping("/globalprocess")
public Page globalprocess(@RequestBody ExpressCountDataList AllData){
Page page = new Page(); List<ExpressCount> updatelist =AllData.getUpdatelist();
List<ExpressCount> insertlist =AllData.getInsertlist();
List<Integer> delidslist=AllData.getDelidslist();
//更新
boolean result = expressCountService.globalprocess(updatelist,insertlist,delidslist);
if(result == true){
page.setErrorCode(0);
page.setSuccess(true);
page.setMessage("操作成功");
}else{
page.setErrorCode(0);
page.setSuccess(true);
page.setMessage("操作失败");
}
return page;
}

Handsontable 的数据保存(增删改查+导出excel)的更多相关文章

  1. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  2. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  3. vue实现对表格数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  4. Node.js + MySQL 实现数据的增删改查

    通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...

  5. vue实现对数据的增删改查(CURD)

    vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...

  6. 基于vue-easytable实现数据的增删改查

    基于vue-easytable实现数据的增删改查 原理:利用vue的数据绑定和vue-easetable的ui完成增删改查 后端接口: 1.条件查询表中数据 http://localhost:4795 ...

  7. vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  8. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  9. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

随机推荐

  1. 我的Android进阶之旅------>Android中如何高效率的进行简繁体转换

    因为APP要做国际化适配,所以就需要顾及到香港和台湾都是使用繁体字,怎样快速便捷高效的把简体字转换成繁体字呢? 说实话我之前用的方法比较呆板,把每个需要转换的字符串进行在线翻译.今天突然发现word或 ...

  2. Symfony4 数据库连接

    代码 https://github.com/liudianpeng/BlogMVC-Symfony4 在 .env 文件可以调整一下数据库连接信息 ###> doctrine/doctrine- ...

  3. 解决github访问慢和clone慢解决方案

    在http://tool.chinaz.com/dns/ 这个网站输入github.com 打开cmd ping各个服务器ip地址,看看哪个比较好 windows下C:\Windows\System3 ...

  4. Oracle学习笔记—connect、resource和dba三种权限(转载)

    转载自: connect.resource和dba三种标准角色: 授权语句: grant connect ,resource,dba to user with admin option; (注意:其中 ...

  5. Verilog HDL设计规范及经验谈(转载)

    1. 规范很重要      工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的.逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现 ...

  6. Putty常用属性设置

    1. 使用 UTF-8避免显示乱码 2.调整 Lines of scrollback,能够回看更多的控制台输出log 3.调整颜色和字体使得看上去更舒服 4.解决数字键盘无法输入数字的问题 效果图:

  7. python常用模块——time模块

    参考博客:http://blog.csdn.net/SeeTheWorld518/article/details/48314501 http://www.jb51.net/article/49325. ...

  8. Nginx -HTTP和反向代理服务器简单配置

    from:http://blog.sina.com.cn/s/blog_6b64b6a701011feh.html Nginx官方测试能够支持5万并发连接,实际生产环境中可支持2-4万并发连接数. 在 ...

  9. 【后缀数组之SA数组】【真难懂啊】

    基本上一搜后缀数组网上的模板都是<后缀数组——处理字符串的有力工具>这一篇的注释,O(nlogn)的复杂度确实很强大,但对于初次接触(比如窝)的人来说理解起来也着实有些困难(比如窝就活活好 ...

  10. 每天一个Linux命令(60)ip命令

        ip命令是Linux下较新的功能强大的网络配置工具.     (1)用法:     用法:  ip  [OPTIONS]  OBJECT  [COMMAND [ARGUMENTS]]     ...