dexteryao 发表于 2020-8-3 14:06:47

SpreadJS 跨表格取数

跨Workbook引用在Excel中偶尔会被使用到,但是在前端环境,由于浏览器权限以及文件存储方式的限制,无法直接引用。

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

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

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

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

var CrossWorkbookFormula = function () {
};
CrossWorkbookFormula.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("CROSSWORKBOOK", 4, 4,
{
    description: "跨表格取数公式",
    parameters: [{
      name: "repaortName",
      repeatable: false,
      optional: false
    },
    {
      name: "reportMonth",
      repeatable: false,
      optional: false
    },
    {
      name: "sheetName",
      repeatable: false,
      optional: false
    },
    {
      name: "range",
      repeatable: false,
      optional: false
    }]
});
CrossWorkbookFormula.prototype.defaultValue = function () { return '取数中...'; };
CrossWorkbookFormula.prototype.evaluate = function (context, repaortName, reportMonth, sheetName, range) {

    var formData = {
      repaortName: repaortName,
      reportMonth: reportMonth,
      sheetName: sheetName,
      range: range
    }
    $.post("spread/getReportRange", formData, function (data) {
      if (data != undefined && data != null) {
            context.setAsyncResult(data);
      }
      else{
            context.setAsyncResult("Error");
      }
    })

};
GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("CROSSWORKBOOK", new CrossWorkbookFormula());
2. 服务端使用GCExcel支持取数

    @RequestMapping(value="/getReportRange", method= RequestMethod.POST)
    public Object getReportDate(@RequestParam(value = "repaortName", required = true) String repaortName,
                              @RequestParam(value = "reportMonth", required = true) String reportMonth,
                              @RequestParam(value = "sheetName", required = true) String sheetName,
                              @RequestParam(value = "range", required = true) String range) {

      String content = getTextFileContent("reports/" + repaortName + '/' + reportMonth + ".ssjson");
      Workbook workbook = new Workbook();
      workbook.fromJson(content);
      IWorksheet sheet = workbook.getWorksheets().get(sheetName);
      IRange dataRange = sheet.getRange(range);
      Object value = dataRange.getValue();
      return value;
    }3. 前端通过可视化方式生成公式
=CROSSWORKBOOK("收入损益表","七月","Sheet1","B2")


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


页: [1]
查看完整版本: SpreadJS 跨表格取数