前言: 版主在日常沟通、技术社区等与使用SpreadJS的小伙伴们交流的过程中,遇到了很多前后端结合的问题。其实从定位来看,SpreadJS无论从技术架构,还是产品设计层面,都是纯前端的控件。但它毕竟最终还是要结合后端环境来开发部署和应用的,所以我有了写这篇文章的想法。 本文利用了一个比较贴近用户的前后端结合的示例工程,来给大家演示一下SpreadJS的一些使用场景和实现技巧,希望能够帮助大家打开思路,能够更好地解决业务问题,提升用户体验。 由于涉及的功能点较多,代码量也不小,这个主题我会分为三篇文章来发布,本篇文章是这个系列的第二篇。第一篇请移步:《SpreadJS结合Springboot实现跨文档数据公式关联 _ Part1》 实现思路: 本文是系列文章第三篇,主要讲解如何实现跨Workbook公式的解析、关联。在Excel中,针对跨Workbook的公式引用,Excel对它们的处理和保存方式是: 1、在包含外部引用的单元格中,对引用目标以[int]的形式保存在sheet中; 2、每个[int]对应一个externalLink.xml的组件来描述。
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,本例不做赘述)。
- // 重点代码部分,这里只演示最关键的一个function
- function showResponse(response) {
- console.log(response);
-
- if(!response){
- console.log("收到Websocket空信息");
- return;
- }
- var asyncDatas = JSON.parse(response);
-
- var spread = GC.Spread.Sheets.findControl('ss');
- spread.suspendCalcService(true);
- spread.suspendPaint();
-
- if(asyncDatas.isValued){
- asyncDatas.formulas.forEach(function(d){
- var sheet = spread.getSheetFromName(d.sheetName);
- var formula = sheet.getFormula(d.row, d.col);
- sheet.setTag(d.row, d.col, {formula: formula});
- sheet.setFormula(d.row, d.col, null);
- sheet.setValue(d.row, d.col, d.value);
- });
- var flg = true;
- relations.forEach(function(r){
- r.referFile == asyncDatas.referFile? flg=!flg: flg;
- });
- flg? relations.push(asyncDatas):false;
- }else{
- var formulas = asyncDatas.formulas;
- formulas.forEach(function(f){
- var formula = f.formula;
- var sheetName = formula.split("!")[0];
- sheetName = sheetName.substring(sheetName.indexOf("]")+1);
- var sheet = spread.getSheetFromName(sheetName);
- if(sheet){
- var range = GC.Spread.Sheets.CalcEngine.formulaToRanges(sheet, formula, 0, 0)[0].ranges[0];
- f.value = sheet.getValue(range.row, range.col);
- }
- console.log(f);
- });
- send(asyncDatas.loadedFile, asyncDatas, true);
- }
- spread.resumePaint();
- spread.resumeCalcService(false);
-
- }
复制代码
|