跨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,返回二维数组或者数组对象,直接填充区域。
|
|