找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超级版主

200

主题

9897

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15523

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

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-8 13:07  /   查看:2814  /  回复:0
本帖最后由 ClarkPan 于 2020-10-8 13:12 编辑

SpreadJS源生不支持跨workbook的公式引用,对一些用户在使用上会造成困扰,对此我们给出了解决方案,利用SpreadJS的自定义函数结合GCExcel后端workbook读取的功能,能够实现跨workbook的公式引用。首先,创建自定义函数中的异步函数,异步函数相较于普通的自定义函数的区别在于,当获取到结果后将会通过异步的方式推送信息至页面,不会占用页面进程导致页面卡顿。在异步函数中发送请求至后端,后端通过GCExcel去跨workbook读取信息。因为需要通过GCExcel在后端实现跨workbook的公式引用取数,所以推荐异步的函数去做。避免网络交互的时间导致页面卡顿影响用户体验
主要代码:
  1. var CrossWorkbookFormula = function () {
  2. };
  3. CrossWorkbookFormula.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("CROSSWORKBOOK", 4, 4,
  4. {
  5.     description: "跨表格取数公式",
  6.     parameters: [{
  7.         name: "repaortName",
  8.         repeatable: false,
  9.         optional: false
  10.     },
  11.     {
  12.         name: "reportMonth",
  13.         repeatable: false,
  14.         optional: false
  15.     },
  16.     {
  17.         name: "sheetName",
  18.         repeatable: false,
  19.         optional: false
  20.     },
  21.     {
  22.         name: "range",
  23.         repeatable: false,
  24.         optional: false
  25.     }]
  26. });
  27. CrossWorkbookFormula.prototype.defaultValue = function () { return '取数中...'; };
  28. CrossWorkbookFormula.prototype.evaluate = function (context, repaortName, reportMonth, sheetName, range) {

  29.     var formData = {
  30.         repaortName: repaortName,
  31.         reportMonth: reportMonth,
  32.         sheetName: sheetName,
  33.         range: range
  34.     }
  35.     $.post("spread/getReportRange", formData, function (data) {
  36.         if (data != undefined && data != null) {
  37.             context.setAsyncResult(data);
  38.         }
  39.         else{
  40.             context.setAsyncResult("Error");
  41.         }
  42.     })



  43. };
  44. GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("CROSSWORKBOOK", new CrossWorkbookFormula());
复制代码
GCExcel根据请求中的参数,在后端读取对应的ssjson文件,然后获取里面workbook中对应的数据进行返回。

主要代码:
  1. @RequestMapping(value="/getReportRange", method= RequestMethod.POST)
  2.     public Object getReportDate(@RequestParam(value = "repaortName", required = true) String repaortName,
  3.                                 @RequestParam(value = "reportMonth", required = true) String reportMonth,
  4.                                 @RequestParam(value = "sheetName", required = true) String sheetName,
  5.                                 @RequestParam(value = "range", required = true) String range) {

  6.         String content = getTextFileContent("reports/" + repaortName + '/' + reportMonth + ".ssjson");
  7.         Workbook workbook = new Workbook();
  8.         workbook.fromJson(content);
  9.         IWorksheet sheet = workbook.getWorksheets().get(sheetName);
  10.         IRange dataRange = sheet.getRange(range);
  11.         Object value = dataRange.getValue();
  12.         return value;
  13.     }
复制代码
最后通过异步函数的推送将内容推送至页面表格指定单元格中进行显示
  1. context.setAsyncResult(data);
复制代码
完整demo如下:
点击跨表格取数按钮,弹出跨表格选择菜单,选择一个workbook进行加载

image.png884105224.png
选择一个单元格的数据后点击选择按钮
image.png609565124.png
之后会创建自定义异步函数,并将该值取到指定单元格
image.png273301085.png
image.png612465514.png

CrossWorkbookDemo.zip

6.5 MB, 下载次数: 35

0 个回复

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