找回密码
 立即注册

QQ登录

只需一步,快速开始

admin 讲师达人认证 悬赏达人认证 活字格认证 SpreadJS 开发认证
管理员   /  发表于:2019-3-8 16:38  /   查看:3555  /  回复:0
前言 | 问题背景
本例是由一位用户提出的实际需求。在类似金额的票据中,一个单元格仅允许填写一位数字,每一个单元格都对应着一个数字位,例如千位、万位、百位等。
据此需求进行分析,可知需要实现以下几点基本操作:
  • 需要把对应表格区域保护并锁定,不能直接允许用户编辑单元格内容,否则不能保证用户仅输入一位数字;
  • 需要针对键盘事件进行监听,通过事件代码为单元格赋值,过滤掉除数字外的其它字符;
  • 在一个单元格填写完毕后,活动单元格自动后移到下一个单元格上,不需要鼠标点选或键盘切换。
本文基于SpreadJS V12版本,下载请点击
示例代码分析
由以上分析可知,首先需要对表单进行保护设置,同时设置一下样式和表头,如下所示:
  1. var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount : 1 });
  2. var sheet = spread.getActiveSheet();
  3. // 设置表单保护
  4. sheet.options.isProtected = true;
  5. sheet.setRowCount(5);
  6. sheet.setColumnCount(9);
  7. sheet.defaults.rowHeight = 60;
  8. sheet.defaults.colWidth = 40;
  9. var style = sheet.getDefaultStyle();
  10. // 设置默认样式的边框
  11. style.borderLeft =new GC.Spread.Sheets.LineBorder("black",GC.Spread.Sheets.LineStyle.thin);
  12. style.borderTop = new GC.Spread.Sheets.LineBorder("black",GC.Spread.Sheets.LineStyle.thin);
  13. style.borderRight = new GC.Spread.Sheets.LineBorder("black",GC.Spread.Sheets.LineStyle.thin);
  14. style.borderBottom = new GC.Spread.Sheets.LineBorder("black",GC.Spread.Sheets.LineStyle.thin);
  15. // 设置对齐方式
  16. style.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
  17. style.vAlign = GC.Spread.Sheets.VerticalAlign.center;
  18. sheet.setDefaultStyle(style);
  19. var arr = ["百","十","万","千","百","十", "元", "角", "分"];
  20. for(let i=0; i<arr.length; i++){
  21.        sheet.setValue(0, i, arr[i], GC.Spread.Sheets.SheetArea.colHeader);
  22. }
  23. sheet.setRowHeight(0, 60, GC.Spread.Sheets.SheetArea.colHeader);
复制代码
键盘事件需要绑定到div上,先进行字符过滤,再执行填值和移动单元格操作。如下所示:
  1. $("#ss").keydown(function (event) {
  2.     // 判断是否是键盘数字键
  3.     var kc = event.keyCode;
  4.     console.log(kc);
  5.     var keyValue = -1;
  6.     if(kc >= 48 && kc <= 57){
  7.         keyValue = kc - 48;
  8.     }else if(kc >= 96 && kc <= 105){
  9.         keyValue = kc - 96;
  10.     }
  11.     if(keyValue >= 0){
  12.         var sel = sheet.getSelections();
  13.         if(sel && sel.length > 0){
  14.             var row = sel[0].row;
  15.             var col = sel[0].col;
  16.             sheet.setValue(row, col, keyValue);
  17.             // 调用命令向后移动一个单元格
  18.             spread.commandManager().execute({
  19.                 cmd: "moveToNextCell",
  20.                 sheetName: sheet.name()
  21.             });
  22.         }
  23.     }
  24. });
复制代码
需要完整示例,请点击此处下载
补充讨论
本例仅仅展示了最基础的实现思路,仍有很多没有完善的地方,由于篇幅因素,仅在此处进行讨论补充一下。例如:在用户填写错误时,如何撤销或删除?当页面上还有其他数据区域时,如何做到自动后移单元格不会超出金额区域?这些问题大家可以思考补充。




0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部