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]