找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

200

主题

9899

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15531

讲师达人悬赏达人微信认证勋章SpreadJS 认证SpreadJS 高级认证元老葡萄

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-31 11:22  /   查看:1996  /  回复:0
数据填报是SpreadJS常见的使用场景。在数据填报场景中,经常存在着数据的前后端交互。例如,将页面填报的数据与后端交互,后端将其存储至数据库。一般在这种情况下,我们不会选择存储所有的数据,而是选择增量存储。每次将有修改的数据获取到,并且更新至数据库中。这样可以有效减少每次交互的数据量。基于SpreadJS类Excel电子表格的特性,往往在数据填报时不单单局限于纯数据的填报。可能还会包含公式计算的元素。在交互时就需要将公式的情况也考虑进去。
最近遇到一个需求,用户需要将填写的数据和公式存储在数据库中。下面就是这个需求的简单实现思路。
实现需求的核心是利用SpreadJS的脏数据功能获取所有修改的内容。之后再按要求进行处理。
首先通过脏数据获取所有的修改痕迹:
  1. var dirtyCells = sheet.getDirtyCells();
复制代码
结果是一个对象数组,对象中只有值的属性没有公式的属性。这里用户需要将公式保存至数据库,所以需要遍历后进行判断再结合getFormula来获得公式。
  1. for(var i=0;i<dirtyCells.length;i++){
  2.   var changeData = {};
  3.   if(sheet.getFormula(dirtyCells[i].row,dirtyCells[i].col)!=null){
  4.     var formula = sheet.getFormula(dirtyCells[i].row,dirtyCells[i].col);
  5.     changeData.type = "formula";
  6.     changeData.row = dirtyCells[i].row;
  7.     changeData.col = dirtyCells[i].col;
  8.     changeData.value = formula;
  9.   }else{
  10.     changeData.type = "value";
  11.     changeData.row = dirtyCells[i].row;
  12.     changeData.col = dirtyCells[i].col;
  13.     changeData.value = dirtyCells[i].newValue;
  14.   }
  15.   changeDataArray.push(changeData);
  16.                                
  17.                                 }
复制代码
这里在循环中做了判断来,判断单元格是否存在公式,如果存在公式就通过getFormula获取公式并存入changeDataArray中,如果不存在直接获取值存入changeDataArray中。
最终,我们可以将changeDataArray传入后端。后端解析后保存至数据库。
另外,通过sheet.clearPendingChanges();我们可以在每次传入之后清空脏数据池,以免再下次获取的时候重复拿到多余的数据。
完整的demo可以在附件进行下载

demo.zip

887.11 KB, 下载次数: 19

0 个回复

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