找回密码
 立即注册

QQ登录

只需一步,快速开始

dexteryao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-8-3 14:06  /   查看:3301  /  回复:0
跨Workbook引用在Excel中偶尔会被使用到,但是在前端环境,由于浏览器权限以及文件存储方式的限制,无法直接引用。

在实际应用中,可以通过异步函数实现类似需求。将文件名或者ID等识别符,以及需要引用区域作为参数,异步请求数据,获取对应内容。

这里有两种实现方式:
1. 前端SpreadJS处理:异步请求直接获取被引用workbokk内容,前端临时workbook加载后获取内容
2. 服务端GCExcel处理:异步请求调用接口,传递被引用workbook信息,GCExcel打开文件后返回对应区域内容。

两种方式各有优势,方法1,获取json后可缓存前端,后续异步公式可使用缓存数据,减轻服务端压力;方法2,网络传输负担小,服务端解析复杂Excel能力强,重复发挥服务器性能和网络带宽。

以方法2为例
1. 前端自定义跨Workbook取数公式,公式四个参数,取数表格名称,取数表格月份(参数),取数sheet,取数单元格

  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());
复制代码
2. 服务端使用GCExcel支持取数

  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.     }
复制代码
3. 前端通过可视化方式生成公式
=CROSSWORKBOOK("收入损益表","七月","Sheet1","B2")


后续可拓展区域取数获取range,返回二维数组或者数组对象,直接填充区域。


0 个回复

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