handsonetable+vue 表格在线编辑
<template>
<div>
<div id="example-container" class="wrapper">
<HotTable ref="testHot" :root="root" :settings="hotSettings"/>
<el-button type="primary" size="small" @click="saveData">{{ '保存' }}</el-button>
<el-button size="small" @click="goBack">{{ '返回' }}</el-button>
<!--<el-button size="small" @click="goBack">{{ $t('task.next_step') }}</el-button>-->
</div>
</div>
</template>
<script>
import HotTable from 'vue-handsontable-official'
export default {
name: 'SampleApp',
components: {
HotTable
},
props: {
taskid: {
type: String,
default: ''
},
createTaskType: {
type: Boolean,
default: false
},
createTaskForm: {
type: String,
default: ''
}
},
data: function() {
return {
root: 'test-hot',
hotSettings: {
data: [],
// startRows: 11, //行列范围
// startCols: 11,
minRows: 1, // 最小行列
// minCols: 6,
width: '100%',
// maxRows: 30, //最大行列
// maxCols: 30,
rowHeaders: true, // 行表头
height: 320,
rowHeights: 23,
colHeaders: true, // 行表头
// colHeaders: ["时间", "Kia", "Nissan", "Toyota", "Honda", "123"], //自定义列表头or 布尔值
// minSpareCols: 2, //列留白
// minSpareRows: 2, //行留白
currentRowClassName: 'currentRow', // 为选中行添加类名,可以更改样式
currentColClassName: 'currentCol', // 为选中列添加类名
autoWrapRow: true, // 自动换行
contextMenu: {
// 自定义右键菜单,可汉化,默认布尔值
items: {
row_above: {
name: '上方插入一行'
},
row_below: {
name: '下方插入一行'
},
// col_left: {
// name: "左方插入列"
// },
// col_right: {
// name: "右方插入列"
// },
hsep1: '---------', // 提供分隔线
remove_row: {
name: '删除行'
}
// remove_col: {
// name: "删除列"
// },
// make_read_only: {
// name: "只读"
// },
// borders: {
// name: "表格线"
// },
// commentsAddEdit: {
// name: "添加备注"
// },
// commentsRemove: {
// name: "取消备注"
// },
// freeze_column: {
// name: "固定列"
// },
// unfreeze_column: {
// name: "取消列固定"
// },
// hsep2: "---------"
}
}, // 右键效果
fillHandle: true, // 选中拖拽复制 possible values: true, false, "horizontal", "vertical"
fixedColumnsLeft: 0, // 固定左边列数
fixedRowsTop: 0, // 固定上边列数
columns: [
// 添加每一列的数据类型和一些配置
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
// {},
// {},
// {},
// {},
{},
{},
{},
{},
{},
{},
{},
{}
],
manualColumnFreeze: true, // 手动固定列
manualColumnMove: true, // 手动移动列
manualRowMove: true, // 手动移动行
manualColumnResize: true, // 手工更改列距
manualRowResize: true, // 手动更改行距
comments: true, // 添加注释
customBorders: [], // 添加边框
columnSorting: true, // 排序
stretchH: 'none' // 根据宽度横向扩展,last:只扩展最后一列,none:默认不扩展
}
}
}, mounted() {
// 获取任务详情
console.log(this.taskid)
if (this.taskid) {
this.$store.dispatch('GET_Field_LIST', this.taskid).then(data => {
// 拼column
var columnSize = data.data.columnLargestSize
if (columnSize === 0) {
columnSize = 30
}
var size = []
for (var i = 0; i < columnSize; i++) {
var col = {}
size.push(col)
}
console.log(size)
// this.hotSettings.columns = size;
// 放数据
this.hotSettings.data = data.data.result
})
}
},
methods: {
goBack() {
this.$parent.goback()
// this.$router.push('/integration/task')
},
submit() {
this.postData()
},
transformTf(str) {
return str.replace(/([A-Z])/g, '_$1').toLowerCase()
},
transformStr3(str) {
const re = /_(\w)/g
return str.replace(re, function($0, $1) {
return $1.toUpperCase()
})
},
saveData() {
var examData = this.$refs.testHot.table.getData() // 这里要注意,如果使用this.hotSettings.data 保存表格数据,拖拽完以后数据的顺序将不会更新,因此使用 this.$refs.testHot.table.getData(); 来获取数据,获取的数据格式为二维数组。
var param = []
param.push(examData)
param.push(this.taskid)
this.$store.dispatch('SAVE_Field_LIST', param).then(data => {
this.$notify({
title: '操作成功',
dangerouslyUseHTMLString: true,
type: 'success'
})
console.log(data)
this.goBack()
})
}
}
}
</script> <style>
button {
margin: 20px 20px;
}
.handsontable .currentRow {
background-color: #e7e8ef;
} .handsontable .currentCol {
background-color: #f9f9fb;
}
#test-hot {
width: 800px;
height: 800px;
overflow: hidden;
}
</style>
效果
后端代码 一个用来回显 一个是修改数据
Resource方法
@SuppressWarnings("unchecked")
@RequestMapping(value = "/template/table/{id}", method = {
RequestMethod.GET }, produces = "application/json;charset=UTF-8")
@ResponseBody
@ApiOperation("给在线模版编辑准备的数据")
public ResponseEntity<RestResponse<List<ImportField>>> getTemplateTableField(
@ApiParam(required = true, name = "Authorization", value = "jwt凭证") @RequestHeader(value = "Authorization", required = true) String Authorization,
@PathVariable(value = "id", required = true) String id) throws URISyntaxException, WebException, Exception {
TableTemplateField result = importFieldService.getTableFieldByTemplateId(id);
return ResponseEntity.ok().body(RestResponse.getRestResponse(CommonCodeMessageEnum.SUCCESS.getBizCode(),
CommonCodeMessageEnum.SUCCESS.getMessage(), result));
} @SuppressWarnings("unchecked")
@RequestMapping(value = "/template/table/{id}", method = {
RequestMethod.POST }, produces = "application/json;charset=UTF-8")
@ResponseBody
@ApiOperation("编辑在线模版")
public ResponseEntity<RestResponse<List<ImportField>>> editTemplateTableField(
@ApiParam(required = true, name = "Authorization", value = "jwt凭证") @RequestHeader(value = "Authorization", required = true) String Authorization,@RequestBody List<String[]> json,
@PathVariable(value = "id", required = true) String id){
System.out.println(json.toString());
importFieldService.editTemplateTableField(json,id);
return ResponseEntity.ok().body(RestResponse.getRestResponse(CommonCodeMessageEnum.SUCCESS.getBizCode(),
CommonCodeMessageEnum.SUCCESS.getMessage(), "success"));
}
数据格式,类似一个list<<string>>的格式,返回和接收都是这个格式
[
["20080101", 10, 11, 12, 13, true],
["20090101", 20, 11, 14, 13, true],
["20010101", 30, 15, 12, 13, true],
["20010101", 32, 213, 21, 312, true],
["20010201", 32, 213, 21, 312, true],
["20010301", 32, 213, 21, 312, true],
["20010401", 32, 213, 21, 312, true],
["20010501", 32, 213, 21, 312, true],
["20010601", 32, 213, 21, 312, true]
],
service方法
/**
* 获取模版字段,转成table
*
* @param id
* @return
*/
public TableTemplateField getTableFieldByTemplateId(String id) {
List<List<String>> datalist = new ArrayList<>();
List<ImportField> list = importFieldRepository.findFieldByTemplateId(id);
// 根据rowNumber 分类column
Map<Integer, List<ImportField>> map = list.stream().sorted(Comparator.comparing(ImportField::getColumnNo))
.collect(Collectors.groupingBy(ImportField::getRowNo,
Collectors.mapping(java.util.function.Function.identity(), Collectors.toList())));
for (Integer i : map.keySet()) {
List<String> contentlist = new ArrayList<>();
for (ImportField field : map.get(i)) {
contentlist.add(field.getName() + "(" + field.getLabel() + ")");
}
datalist.add(contentlist);
}
System.out.println(datalist.toString());
TableTemplateField tableTemplateField = new TableTemplateField();
tableTemplateField.setResult(datalist);
// 获取最大的column
Optional<ImportField> importField = list.stream().max(Comparator.comparingInt(ImportField::getColumnNo));
Integer columSize = importField.isPresent() ? importField.get().getColumnNo() : 0;
tableTemplateField.setColumnLargestSize(columSize);
return tableTemplateField;
} /**
* 修改模版field 全删全增
*
* @param json
* @param id
*/
public void editTemplateTableField(List<String[]> dataList, String id) {
ImportTemplate template = importTemplateRepository.findOne(id);
Set<ImportField> fields = new HashSet<ImportField>();
if (dataList.size() > 0) {
for (int i = 1; i <= dataList.size(); i++) {
String[] heads = dataList.get(i - 1);
for (int b = 1; b <= heads.length; b++) {
ImportField field = new ImportField();
String fieldcontent = heads[b - 1];
field.setRowNo(i);
field.setColumnNo(b);
// 可能存在空字段
if (!StringUtils.isEmpty(fieldcontent)) {
if (fieldcontent.contains("rowkey")) {
field.setIsRowKey(1);
}
int a = fieldcontent.indexOf("(");
int c = fieldcontent.indexOf(")");
if (a == -1 || c == -1) {
throw new WebException(ErrorEnum.ERR_FIELDNAME_UNFORMATTER);
}
String label = fieldcontent.substring(a + 1, c);
String name = fieldcontent.substring(0, a);
field.setName(name);
field.setLabel(label);
fields.add(field);
}
}
}
if (dataList.size() > 1) {
template.setIsMutipartTitle(1);
}
template.setTitleLine(dataList.size());
template.setImportField(fields);
importTemplateRepository.save(template);
}
}
handsonetable+vue 表格在线编辑的更多相关文章
- vue 表格数据编辑,点击取消或者完成按钮后,关闭编辑状态没有及时生效
点击编辑按钮: 编辑状态下,表格可以编辑.但是点击“确认”或者“取消”按钮,列数据编辑状态已经修改,但是视图没有改变. 页面代码: 获取当前行的index,并直接修改当前行用于判断是否编辑状态的数据为 ...
- [前端插件]Bootstrap Table服务器分页与在线编辑应用总结
先看Bootstrap Table应用效果: 表格用来显示数据库中的数据,数据通过AJAX从服务器加载,同时分页功能有服务器实现,避免客户端分页,在加载大量数据时造成的用户体验不好.还可以设置查询数据 ...
- 如何配置使用HTML在线编辑工具
如何配置使用HTML在线编辑工具 为了更好的.统一的编写统一简单易用的博客,决定采用TinyMCE工具.首先下载TinyMCE4.0包.文件目录如下: 其中, Plugins是插件目录,包括各种插件 ...
- ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
嗯,需要做成这个样子,所以网上查了些资料.整理了下.提供几个一个思路.不足之处请小伙伴指出来. 普通版的table可编辑内嵌select选择框,输出框,编辑删除添加等 <!DOCTYPE ht ...
- [个人开源]vue-code-view:一个在线编辑、实时预览的代码交互组件
组件简介 vue-code-view是一个基于 vue 2.x.轻量级的代码交互组件,在网页中实时编辑运行代码.预览效果的代码交互组件. 使用此组件, 不论 vue 页面还是 Markdown 文档中 ...
- 在线编辑Word——插入图表
在Word中可插入图表,配合使用表格能够更加全方位的展示数据的可信度并增加数据的可读性.本文将通过使用在线编辑器 Spire.Cloud Word 演示如何来插入图表,并设置相关格式化操作.具体步骤如 ...
- Microsoft Azure Web Sites应用与实践【3】—— 通过Visual Studio Online在线编辑Microsoft Azure 网站
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
- 小讲堂:在线编辑在Mobox文档管理软件中的意义
今天我们来讨论一下,mobox文档管理软件中的在线编辑的这个功能,相信这个功能是用户在日常的文档维护中非常需要的. 文档管理软件的诸多功能中,在线编辑是一块很重要的功能点,因为在线编辑可以说是提高工作 ...
- FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架
这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...
随机推荐
- websocket之拨云见雾
websocket是基于http相应的特性弥补其不足(就是个socket,不再是一次请求一次相应) 但缺点就是只有在版本较高的浏览器才支持websocket. 浏览器: <script type ...
- 英特尔的Gen11集成显卡性能再次发力
这是英特尔首个达到 1 TeraFLOP 算力的图形模块,与第九代酷睿移动版的性能相比,15W Ice Lake-U 在游戏测试场景中,平均帧速率的性能提升了 40%. 与同等的 AMD 产品相比,英 ...
- Java中通过相对路径来定位文件
通常我们定位文件都是通过绝对路径进行定位,比如“F:/Java/bin/test/test.java”,这样的缺点就是,一旦项目文件移动,这些路径就完全失效. 所以,下面我们来介绍一种通过相对路径来定 ...
- Java 集合类库
java类库的基本结构 Iterable public interface Iterable<T> 实现这个接口允许对象成为 "foreach" 语句的目标. 也就是说 ...
- Laravel5.5去除URL中的index.php生成优雅链接
在使用Apache情况下: Laravel 框架通过 public/.htaccess 文件来让网址中不需要 index.php.如果你的服务器是使用 Apache ,请确认是否有开启 mod_rew ...
- CPC/CPM/CPA/CPS定义
CPC 每点击次数计费 CPM 每千人次展现计费 CPA 每行动成果计费(比如推广成功一个用户) CPS 淘宝客类型,按照商品佣金,推广成功计费
- 【NOIP2016提高A组模拟9.15】Osu
题目 分析 考虑二分答案, 二分小数显然是不可取的,那么我们将所有可能的答案求出来,记录在一个数组上,排个序(C++调用函数很容易超时,手打快排,时间复杂度约为\(O(>8*10^7)\),但相 ...
- 【NOIP2012模拟10.31】掷骰子
题目 太郎和一只免子正在玩一个掷骰子游戏.有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时 ...
- 【shell】awk格式对齐文本
源: 218.104.69.100 218.104.69.100 安徽合肥 218.104.69.99 218.104.69.99 安徽合肥 61.190.72.38 61.190.72.38 安徽合 ...
- 【java】并发执行ExecutorService的sumbit返回值的顺序问题
ArrayList<Future> fl = new ArrayList<Future>(); for (int i = 0; i < 10; i++) { Future ...