Handsontable 的数据保存(增删改查+导出excel)

2023-11-07

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

全局容器

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

handsontable 的初始化

function onIniHandsonTable(data) {
KaTeX parse error: Expected 'EOF', got '#' at position 3: ('#̲hot').empty(); …/
}
],
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 updatelist;
List insertlist;
List 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 未调用 Ajax 回调。如何解决这个问题?

    我再次来这里寻求您的建议 我有一些 AJAX 调用 用于从我的编辑器 PHP 在线编辑器 运行代码 大家可以来看看my site http web guru99 com 我有一些 ajax 调用来发送编辑器的数据并接收输出 问题 for 循
  • $(window).resize() 和打印预览模式

    我有一段非常简单的代码 可以在调整大小后刷新窗口 window resize function location reload 当我尝试在 Chrome 中打开打印预览模式 Ctrl P 时 它也会刷新它 有什么想法如何避免这种行为吗 要确
  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • Canvas drawImage 内联 svg 在 Firefox 上不起作用

    这是一个例子 它采用 svg 并将其转换为画布 http jsfiddle net Na6X5 944 http jsfiddle net Na6X5 944 var can document getElementById canvas1
  • Firefox 中的 jQuery 表单提交

    请帮我解决一个问题 我有这个代码 用于通过锚点提交表单
  • jQuery 插件与小部件

    几个月前 我开始使用 jQuery 插件进行一些实验 我在互联网上找到了一些教程 然后开始整理一些东西 几天前 我需要构建自己的 插件 并回到我的旧项目 当我试图在互联网上找到更多信息时 我偶然发现了这些称为小部件的新 东西 据我了解 我应
  • Draggable 正在阻止触摸事件

    我正在尝试使用拖动来来回移动 div 这部分工作正常 直到 div 具有可滚动内容 由于滚动条 这在桌面上不是问题 但在触摸设备上会出现问题 由于触摸事件与拖动事件冲突 我无法滚动内容 我尝试创建一个条件来检测拖动是否水平方向多于垂直方向
  • jQuery Mobile:$(...).listview 不是函数

    我正在尝试在 UL 中动态插入 LI 元素后刷新 jQuery Mobile 中的列表视图 每当我尝试 myUL listview refresh 在控制台上我收到错误 未捕获的类型错误 listview 不是函数 我该如何解决这个问题 确
  • 在 javascript 中循环 html 复选框

    实际上我有一个关于如何在java脚本中循环复选框的问题 假设我在jsp循环中创建了html复选框 我希望在javascript中对这些复选框进行验证 我应该怎么做 通常对于单个对象 我们可以执行 window document form c
  • 在 JavaScript 中对数组进行排序

    我正在尝试对内部包含整数的数组进行排序 例如 var array 123 3 745 4 643 5 643 2 我如何对其进行排序才能返回类似以下内容的内容 array 745 4 643 2 643 5 123 3 您可以将自定义比较函
  • 无法获取子 DOM 元素

    注 由于问题有点复杂 为了可读性对代码进行了抽象 We ve a
  • 查找第一个可滚动父级

    我遇到这种情况 需要将元素滚动到视口中 问题是我不知道哪个元素是可滚动的 例如 在纵向中 主体是可滚动的 而在横向中 它是另一个元素 还有更多情况会更改可滚动元素 现在的问题是 给定一个需要滚动到视口中的元素 找到其第一个可滚动父元素的最佳
  • 用 JavaScript 改变文本颜色?

    我想在单击按钮时更改标题的颜色 这是我的代码 但它不起作用 我不明白为什么不 var about function init about document getElementById about innerHTML about style
  • 为什么我会失去对元素的引用?

    我偶然发现了一些奇怪的东西 至少对我来说 案例如下 我选择一个元素 child1 从 DOM 并将其保存到变量中 我继续添加一个新元素child1的家长 parent1 现在 如果我尝试修改某些值child1它不记录更改 似乎引用已经消失
  • 地理编码服务与 gMap 搜索之间的差异结果

    我想获取此地址的纬度和经度 Boulevard de la Marne Zone industrielle COULOMMIERS 77120 France 我将 api 添加到我的页面 当我使用 gmaps 时 结果很好 但是当我想通过
  • Angular CDK Overlay,更改默认覆盖容器

    有没有办法改变OverlayContainer 我创建了一个工具提示组件 但有时我想将叠加层附加到特定元素 默认情况下 叠加层附加到文档正文 以下是我创建叠加层的方法 private initOverlay void const posit
  • ajaxStart 和 ajaxStop 与 fetch API 等效

    我正在尝试将 API 调用从使用 jQuery ajax 迁移到使用 Fetch API 我使用 jQuery ajaxStart 和 ajaxStop 在服务器调用期间显示加载旋转器 我正在运行多个并行服务器请求 我希望旋转器在第一个请求
  • 通过 Javascript 填充 ReactJS HTML 表单

    我正在开发一个应用程序 在打开第 3 方网站后 我可以在浏览器上下文中运行我自己的 Javascript 作为一个基于reactjs构建并具有登录表单的示例网站 您可以参考此链接 我正在尝试在reactjs生成的表单中填写用户名和密码 但是
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 解析函数是否异步传递给 Promise 执行器?

    我有以下代码 function myPromiseFunc return new Promise resolve gt resolve Promise resolve 123 据我们所知Promise resolve方法立即用普通值解析 P

随机推荐

  • 华为OD机试真题 Java 实现【数字加减游戏】【2023Q1 200分】

    一 题目描述 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 每个回合 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a 其中b没有使用次数限制 请问小明最少可以用多少次a 才能将数字s变成
  • Visual Studio 2015 Tools for Unity与VS2015的bug

    之前使用Unity4 X配合的是Visual Studio 2013 Tools与VS2013的时候 是可以打开项目属性的 更换了Unity5 x配合Visual Studio 2015 Tools for Unity与VS2015的时候
  • 基于springboot开发的学生考勤管理系统【毕业论文,源码】

    基于springboot开发的学生考勤管理系统 如需更多资料请前往文章底部获取联系方式 系统设计主要功能 通过市场调研及咨询研究 了解了学生考勤管理系统及管理者的使用需求 于是制定了管理员 教师和学生等模块 功能结构图如下所示 E R图 考
  • 原子操作 CAS

    参考 https zhuanlan zhihu com p 400817892 https www bilibili com read cv10686883 https blog csdn net www dong article deta
  • nacos默认用户名密码_Nacos 权限控制介绍及实战

    转自 阿里巴巴中间件 作者 朱鹏飞 Nacos权限控制设计方案 方案背景 Nacos 自开源依赖 权限控制一直需求比较强烈 这也反应了用户需求将 Nacos 部署到生产环境的需求 最新发布的 Nacos 1 2 0版本已经支持了服务发现和配
  • 文件夹选择对话框 JS实现的两种方案

    文件夹选择对话框 JS实现的两种方案 browseFolder js 该文件定义了BrowseFolder 函数 它将提供一个文件夹选择对话框 以供用户实现对系统文件夹选择的功能
  • 监听器,过滤器,拦截器

    参考博文 文章目录 作用 三者区别 启动顺序 拦截器 简要说明 实现接口 HandlerInterceptor 自定义拦截器 配置拦截器 过滤器 简要说明 在springboot 启动类添加该注解 ServletComponentScan
  • 在word如何显示左侧的索引目录

    https jingyan baidu com article 2c8c281df82bd80008252a23 html
  • 自动控制原理知识点梳理——6.线性系统的校正方法

    主要内容是书上6 1 6 2 6 3 目录 一 系统的设计与校正问题 1 控制系统的性能指标 2 系统带宽的选择 3 校正方法 4 基本控制规律 1 比例 P 控制规律 2 比例 微分 PD 控制规律 3 积分 I 控制规律 4 比例 积分
  • osgEarth的Rex引擎原理分析(六十)TileNode与DrawTileCommand的关系

    目标 五十五 中的问题131 TileNode与DrawTileCommand的关系 DrawTileCommad的几何图形和瓦片编号从TileNode来 最终绘制是用DrawTileCommand的draw函数来实现的 DrawTileC
  • 服务器显示post是什么意思,post请求 post请求是什么

    在HTTP协议的请求类型中 post请求是一个比较常见的请求类型 也是一个使用比较频繁的请求 那么这一个请求到底是什么意思呢 这就是今天我们所要了解的内容 快来一起看一看吧 post请求 post请求的含义 向指定资源提交数据进行处理请求
  • Golang Channel通道使用简介

    Golang Channel通道使用简介 一 channel简介 chan 是 Golang 中内置的数据类型 不像 Mutex 等需要引入 它是 first class 类型 在 Go 的并发控制中起着相当重要的作用 chan 的思想来自
  • CWnd指针和HWnd

    HWND是Windows系统中对所有窗口的一种标识 即窗口句柄 这是一个SDK概念 CWnd是MFC类库中所有窗口类的基类 微软在MFC中将所有窗口的通用操作都封装到了这个类中 如 ShowWindow等等 同时它也封装了窗口句柄即m hW
  • linux下编译dbus源码,ubuntu安装dbus

    下载地址 编译安装 configure prefix home ubuntu dbus 1 13 18 install make make install 出现如下错误 configure error The pkg config scri
  • qt Graphic View 学习

    是一种基于图形项的 Graphic Item 模型 视图模式 由场景 视图 图形项组成 1 场景 QGraphicScence类 场景不可见 是管理图像项的容器 场景坐标 等价于Qpainter的逻辑坐标 窗口坐标 setwindow 一般
  • 查询及删除重复记录

    查询及删除重复记录的方法大全 1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断select from peoplewhere peopleId in select peopleId from people gro
  • Notepad++ 代码格式化

    在阅读别人的代码时偶尔会遇到格式很乱 阅读起来很费劲的情况 若手动改 很容易出错且很费时间 这时可以借助一些专业的编辑器来格式化代码 NotePad 是一个轻量级的代码编辑器 占用内存少 运行速度快 但是Notepad 本身是不带这个格式化
  • Unity基础(06)—— 动画(Animation)的录制与播放

    一 录制动画 将物体移动 操作的过程录制下来保存到一个物理文件 在下次使用的时候直接用代码来调用它即可 如让物体TheCh1 绕Y轴转动90度的动画录制 1 在Unity中打开动画视图 2 选择指定物体 为其添加 Animation 组件
  • python3GUI--PyQt5打包心得(详细图文演示)

    文章目录 一 前言 二 准备工作 介绍 1 准备 2 介绍 1 pyinstaller 2 pipenv 三 项目打包 1 准备 2 打包 1 打包参数 2 虚拟环境 三 总结 一 前言 有朋友私信问我 如何把项目打包和如何减小打包后的文件
  • Handsontable 的数据保存(增删改查+导出excel)

    项目用到handsontable 插件 根据官网 API写的handsontable初始化 数据展示 ajax请求 参数封装 Controller参数接受 全局容器 var AllData var updatelist var delids