本帖最后由 ClarkPan 于 2020-10-8 13:12 编辑
SpreadJS源生不支持跨workbook的公式引用,对一些用户在使用上会造成困扰,对此我们给出了解决方案,利用SpreadJS的自定义函数结合GCExcel后端workbook读取的功能,能够实现跨workbook的公式引用。首先,创建自定义函数中的异步函数,异步函数相较于普通的自定义函数的区别在于,当获取到结果后将会通过异步的方式推送信息至页面,不会占用页面进程导致页面卡顿。在异步函数中发送请求至后端,后端通过GCExcel去跨workbook读取信息。因为需要通过GCExcel在后端实现跨workbook的公式引用取数,所以推荐异步的函数去做。避免网络交互的时间导致页面卡顿影响用户体验
主要代码:
- 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());
复制代码 GCExcel根据请求中的参数,在后端读取对应的ssjson文件,然后获取里面workbook中对应的数据进行返回。
主要代码:
- @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;
- }
复制代码 最后通过异步函数的推送将内容推送至页面表格指定单元格中进行显示
- context.setAsyncResult(data);
复制代码 完整demo如下:
点击跨表格取数按钮,弹出跨表格选择菜单,选择一个workbook进行加载
选择一个单元格的数据后点击选择按钮
之后会创建自定义异步函数,并将该值取到指定单元格
|
|