找回密码
 立即注册

QQ登录

只需一步,快速开始

KevinChen 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-9-30 11:53  /   查看:2570  /  回复:0
前言:
版主在日常沟通、技术社区等与使用SpreadJS的小伙伴们交流的过程中,遇到了很多前后端结合的问题。其实从定位来看,SpreadJS无论从技术架构,还是产品设计层面,都是纯前端的控件。但它毕竟最终还是要结合后端环境来开发部署和应用的,所以我有了写这篇文章的想法。
本文利用了一个比较贴近用户的前后端结合的示例工程,来给大家演示一下SpreadJS的一些使用场景和实现技巧,希望能够帮助大家打开思路,能够更好地解决业务问题,提升用户体验。
由于涉及的功能点较多,代码量也不小,这个主题我会分为三篇文章来发布,本篇文章是这个系列的第二篇。第一篇请移步:《SpreadJS结合Springboot实现跨文档数据公式关联 _ Part1
实现思路:
本文是系列文章第三篇,主要讲解如何实现跨Workbook公式的解析、关联。在Excel中,针对跨Workbook的公式引用,Excel对它们的处理和保存方式是:
1、在包含外部引用的单元格中,对引用目标以[int]的形式保存在sheet中;
image.png48973998.png
2、每个[int]对应一个externalLink.xml的组件来描述。
image.png712408141.png

SpreadJS由于平台所限(JS语言本身不能实现引用文件等操作),无法兼容Excel的外部引用,因此无法读取和解析externalLink.xml的内容,只能拿到[int]的表达式。所以需要客户手动关联[int]与外部文件的引用关系。
运行环境:
Java SpringBoot+ SpreadJS
运行方法:
解压后导入Eclipse(或其它IDE工具),Run Java Application ,访问localhost:8080即可。
关键代码讲解:
关联文章《SpreadJS结合Springboot实现跨文档数据公式关联 _ Part1》和《SpreadJS结合Springboot实现跨文档数据公式关联 _ Part2》。
本篇是SpreadJS跨文档数据公式关联系列文章的第三篇,重点讲解如何实现跨Workbook公式的引用(公式的计算SpreadJS有专用API,本例不做赘述)。

  1. // 重点代码部分,这里只演示最关键的一个function
  2. function showResponse(response) {
  3.         console.log(response);
  4.        
  5.         if(!response){
  6.                 console.log("收到Websocket空信息");
  7.                 return;
  8.         }
  9.         var asyncDatas = JSON.parse(response);
  10.        
  11.         var spread = GC.Spread.Sheets.findControl('ss');
  12.         spread.suspendCalcService(true);
  13.         spread.suspendPaint();
  14.        
  15.         if(asyncDatas.isValued){
  16.                 asyncDatas.formulas.forEach(function(d){
  17.                         var sheet = spread.getSheetFromName(d.sheetName);
  18.                         var formula = sheet.getFormula(d.row, d.col);
  19.                         sheet.setTag(d.row, d.col, {formula: formula});
  20.                         sheet.setFormula(d.row, d.col, null);
  21.                         sheet.setValue(d.row, d.col, d.value);
  22.                 });
  23.                 var flg = true;
  24.                 relations.forEach(function(r){
  25.                         r.referFile == asyncDatas.referFile? flg=!flg: flg;
  26.                 });
  27.                 flg? relations.push(asyncDatas):false;
  28.         }else{
  29.                 var formulas = asyncDatas.formulas;
  30.                 formulas.forEach(function(f){
  31.                         var formula = f.formula;
  32.                         var sheetName = formula.split("!")[0];
  33.                         sheetName = sheetName.substring(sheetName.indexOf("]")+1);
  34.                         var sheet = spread.getSheetFromName(sheetName);
  35.                         if(sheet){
  36.                                 var range = GC.Spread.Sheets.CalcEngine.formulaToRanges(sheet, formula, 0, 0)[0].ranges[0];
  37.                                 f.value = sheet.getValue(range.row, range.col);
  38.                         }
  39.                         console.log(f);
  40.                 });
  41.                 send(asyncDatas.loadedFile, asyncDatas, true);
  42.         }
  43.         spread.resumePaint();
  44.         spread.resumeCalcService(false);
  45.        
  46. }
复制代码


SpreadJS_SpringBoot.zip

6.34 MB, 下载次数: 18

0 个回复

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