通过Handsontable实现像Excel一样编辑数据
一、Handsontable是指什么?
Handsontable是一个JavaScript库,可以帮助您轻松实现类似Excel电子表格一样的编辑方式。
在示范页面尝试一下就知道了,不仅可以像Excel那样输入数据,还有可指定单元格的格式、制作图表等丰富的功能。
二、概要
kintone作为云服务低代码平台,虽然可以通过浏览器直接查看记录列表以及编辑记录等操作,但还是有不少客户反映希望可以像Excel那样查看、编辑数据。
这次就向大家介绍一下如何使用Cybozu CDN中公布的Handsontable来实现类似Excel的编辑方式。感兴趣的务必请尝试一下哦。
三、准备应用
首先准备好应用。
1、字段设置
应用的字段设置如下。字段名称和字段代码一样。

2、列表的设置
列表使用自定义列表。
通过HTML来编写显示电子表格所需要的元素。
<div id="sheet"></div>
关于自定义列表的详情,请参考以下页面。
3、JavaScript/CSS的设置
本次使用Cybozu CDN中的库。Cybozu CDN不单单提供JavaScript,还有CSS文件。这些内容存在缓存里,具有访问速度快的优点。
这次使用的是version 0.20.0※。在应用的JavaScript/CSS设置页面,输入以下URL。
JavaScript URL
https://js.cybozu.cn/handsontable/0.20.0/handsontable.full.min.jsCSS URL
https://js.cybozu.cn/handsontable/0.20.0/handsontable.full.min.css
备注:在本篇文章中使用的 Handsontable,从 v7.0.0 开始将不再是 MIT License。
在本篇文章的自定义里,请使用许可证为 MIT License 的 v0.20.0(查看许可证内容)。
如需使用 v7.0.0 或更高版本时,请从 Handsontable 的官方网站 购买付费许可证,并在遵守许可证条件的前提下使用。
有关详细信息,请参阅 Cybozu CDN 许可证对应指南。
4、输入数据
先输入几条数据,以方便后面确认用。
四、JavaScript
然后通过JavaScript来编写代码。
1、Handsontable的使用方法
只要指定以下内容即可显示电子表格。数据的话,在Handsontable的data选项中指定kintone的记录数据就可以实现数据绑定了。
var
container = document.getElementById('sheet');
var hot = new Handsontable(container, {
data: data, // 指定数组或对象的数据
minSpareRows: 1, // 指定下边余白
rowHeaders: true, // 指定列的标题
colHeaders: true, // 指定行的标题
contextMenu: true // 显示右击菜单
});
2、在电子表格中显示记录列表
首先单纯地试一下将kintone记录显示到电子表格。
Handsontable的data选项指定为kintone的记录数据,columns指定为"字段名称.value",这样就可以使kintone的记录数据显示到电子表格了。
根据需要,可通过数组形式给colHeaders选项指定标题行。
※viewId是设置自定义列表时输入的viewId。
(function() {
"use strict";
kintone.events.on(['app.record.index.show'], function(event) {
// 指定列表ID(指定的列表ID的列表不处理)
if (event.viewId !== 7199) return;
var records = event.records;
// 创建自定义列表时填写的HTML元素。
var container = document.getElementById('sheet');
// Handsontable实例化
var hot = new Handsontable(container, {
// 指定kintone的记录数据
data: records,
minSpareRows: 0,
// 指定列的标题
colHeaders: ["记录编号", "公司名称", "对方负责人", "签约日", "准确度", "产品名称", "单价", "用户数", "合计"],
contextMenu: false,
// 指定显示data对象的哪列。
columns: [
{data: "记录编号.value"},
{data: "公司名称.value"},
{data: "对方负责人.value"},
{data: "签约日.value"},
{data: "准确度.value"},
{data: "产品名称.value"},
{data: "单价.value"},
{data: "用户数.value"},
{data: "合计.value"}
]
});
});
})();
这样,kintone中的数据应该就能像Excel那样显示了。

3、更新电子表格内显示的记录
到这里显示已经搞定了,但是还需要可以更新数据。
更新时,会调用afterChange选项中指定的方法,使用该方法,就可以进行kintone的更新处理了。
另外,在指定columns选项时,可以将不想被更改的数据指定为readOnly。
(function() {
// 保存记录的方法
"use strict";
var saveRecords = function(records, callback, errorCallback) {
kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {app: kintone.app.getId(), records: records},
function(resp) {
callback(resp);
},
function(resp) {
errorCallback(resp);
});
};
// 更新kintone记录时使用的方法:要先排除不能更新的字段,比如记录编号等。
var setParams = function(record) {
var result = {};
for (var prop in record) {
if (['记录编号', '创建时间', '更新时间', '创建人', '更新人'].indexOf(prop) === -1) {
result[prop] = record[prop];
}
}
return result;
};
// 显示列表使用的事件语句
kintone.events.on(['app.record.index.show'], function(event) {
if (event.viewId !== 7199) return;
var records = event.records;
var container = document.getElementById('sheet');
var hot = new Handsontable(container, {
data: records,
minSpareRows: 0,
colHeaders: ["记录编号", "公司名称", "对方负责人", "签约日", "准确度", "产品名称", "单价", "用户数", "合计"],
contextMenu: false,
// 根据需要可指定readOnly。
columns: [
{data: "记录编号.value", readOnly: true},
{data: "公司名称.value"},
{data: "对方负责人.value"},
{data: "签约日.value"},
{data: "准确度.value"},
{data: "产品名称.value"},
{data: "单价.value"},
{data: "用户数.value"},
{data: "合计.value", readOnly: true}
],
// 电子表格的单元格被更新时,以下方法会被调用。
// 调用的aftarChange方法可知道参数change中变更的单元格的详情,参数source可知道从什么变更而来的。
afterChange: function(change, source) {
if (source === 'loadData') {
return;
}
var i;
var targets = [];
// 读取参数change的数据,发行kintone的更新API。
for (i = 0; i < change.length; i++) {
targets.push({
id: records[change[i][0]]["记录编号"].value,
record: setParams(records[change[i][0]])
});
}
saveRecords(targets, function(resp) {console.dir(resp); }, function(resp) {console.dir(resp); });
}
});
});
})();

afterChange方法的参数Change保存以下数组。上面的列子中,参照"发生了更改的单元格的行数"来指定要更改哪条记录。
// 第10行,对方负责人被更新时
[
[
9, // 发生变更的单元格的行数
"对方负责人.value", // 发生变更的单元格的列数
"测试人员", // 变更前的数据
"测试人员" // 变更后的数据
]
]
顺便说一下,数据绑定是自动的,在电子表格上更改数据后,会立即反映到kintone的event.records变量里。非常便利。
五、最后
怎么样?不单单外表看起来像Excel,可以像Excel那样进行数据显示和编辑吧。
添加记录及下拉菜单等的选择,请点击:https://cybozudev.kf5.com/hc/kb/article/219875/
通过Handsontable实现像Excel一样编辑数据的更多相关文章
- Handsontable vue如何实现在线编辑excal
官网地址:https://handsontable.com/ 1.实现效果 2.安装 import { HotTable } from '@handsontable/vue' import Hands ...
- Web jquery表格组件 JQGrid 的使用 - 7.查询数据、编辑数据、删除数据
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- excel中的数据导入oracle方法
SQL_loader批量上传数据 1. 注释 在工作中,很多时候会遇到如下情况:需要将excel中的数据批量上传到ORACLE表中.如果是小数据量,如几十条至几百条,那么用plsql dev工具 ...
- 利用Kettle 从Excel中抽取数据写入SQLite
SQLite作为一种数据库可以配置为Kettle的数据输入和输出,这个例子是从Excel中抽取数据然后写入到SQLite中 配置测试并成功后如下 下面是配置步骤: Excel输入配置 sqlite配置 ...
- Java实现PDF和Excel生成和数据动态插入以及导出
一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...
- NOPI读取模板导出(Excel中追加数据)
在Controller里,我们定义一个FileResult的Action,返回值是一个文件形式被浏览器下载下来. [HttpGet] public FileResult ExportProductLi ...
- thinkphp导入导出excel表单数据
在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- c#.net Excel中的数据导入到SQL数据库中
/// <summary> /// 从Excel 导入学生 /// </summary> /// <param name=&qu ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
随机推荐
- ASP.NET实现前台调用后台变量或者方法
前台页面 <div> <%= Name %> </div> <div> <%= getName() %> </div> 后台代码 ...
- vue+iview 表格行选中修改背景色
<Table :columns="columns" :no-data-text="L('NoDatas')" border :data="lis ...
- linux驱动设备分类
1. linux驱动设备分类 1.1 字符设备 -c 1.没有文件系统 2.应用程序和驱动程序之间进行数据交互时,数据是以"字节"进行数据交换,并且是按照固定的顺序传输的,数据是实 ...
- SpringBoot之基于idea搭建ssm(maven)
此次目标为搭建一个简单的基于springboot的ssm(spring + springmvc + mybatis)的maven项目,使用的数据库为mysql. 最终项目目录结构 创建过程 1.项目创 ...
- luac编译命令
luac -o out.lua 1.lua 可以不要后缀 luac -o out 1.lua
- cl 编译器环境配置
安装 visual studio 2019 其他版本路径可能有差别,需自行对照查找. visual studio 2019安装目录 和 Windows kits 文件夹[在同一目录下] 即VS 如果安 ...
- 如何解决 Iterative 半监督训练 在 ASR 训练中难以落地的问题丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自微软亚洲研究院.声网.数美科技的技术专家,围绕该话 ...
- 小霸王、红白机、FC游戏、街机游戏在线玩的网站
前段时间小笨就想做一个红白机在线玩的网站,作为90后,也玩过不少小霸王fc游戏,于是花了两个星期时间做了出来.前端界面略丑,因为小笨不是专做前端的,就将就一下吧,哈哈!网站暂时添加了数款怀旧游戏,包括 ...
- 从零开始学Java系列之Java是什么?它到底是个啥?
全文大约[5000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!文章带有丰富案例及配图,只为让你更好的理解和运用文中的技术概念,给你带来具有足够的思想启迪...... ----------- ...
- 【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)
背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包.完全背包.多重背包.分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出 ...