SpreadJS + GCExcel实现服务端数据绑定
SpreadJS和GCExcel都支持数据绑定。通常我们可以使用SpreadJS的双向数据绑定实现前端填报和报表展示,参考https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/data-binding/table-binding/purejs也可以使用GCExcel的模板引擎轻松的批量产出Excel或PDF报表,参考https://demo.grapecity.com.cn/documents-api-excel-java/demos/templates
那么如果结合两个产品实现前端SpreadJS设计模板,服务端批量导出报表呢?
可以通过如下两种方式
1. GCExcel支持SpreadJS的数据绑定,可以直接给定数据源,实现和SpreadJS一样的绑定
在通过fromJSON导入模板后,直接绑定数据即可
// 导入SpreadJS模板2. 通过BindingPath将SpreadJS版本转为GCExcel模板,这种方式更加灵活,通过GCExcel灵活的模板系统可以实现更多效果
或者在设计模板时候通过Tag标记一些信息指定模板的信息
BindingPath转GC模板参考代码
for (int i = 0; i < usedRange.getRowCount(); i++) {
for (int j = 0; j < usedRange.getColumnCount(); j++) {
String bindingPath = sheet.getRange(i, j).getBindingPath();
if (bindingPath != null && !bindingPath.equals("")) {
sheet.getRange(i, j).setValue("{{ds." + bindingPath + "}}");
}
}
}
ITables tables = sheet.getTables();
if (tables != null && tables.getCount() > 0) {
for (int i = 0; i < tables.getCount(); i++) {
ITable table = tables.get(i);
String bindingPath = table.getBindingPath();
if (bindingPath != null && !bindingPath.equals("")) {
IRange range = table.getDataRange();
for (int j = 0; j < range.getColumnCount(); j++) {
String dataFeild = table.getColumns().get(j).getDataField();
IRange cell = sheet.getRange(range.getRow(), range.getColumn() + j);
if (dataFeild != null && !dataFeild.equals("")) {
if (j == 0) {
String firstRowRange = (range.getRow() + 1) + ":" + (range.getRow() + 1);
cell.setValue("{{ds." + bindingPath + "." + dataFeild + "(R=" + firstRowRange + ",G=list,S=none)}}");
} else {
cell.setValue("{{ds." + bindingPath + "." + dataFeild + "}}");
}
} else {
String formula = cell.getFormula();
if (formula != null && !formula.equals("")) {
cell.setValue("{{=" + formula + "}}");
}
}
}
}
}
}转换完成之后进行绑定
前后端结合使用能突破前端的性能瓶颈,同时解决前端PDF需要注册字体的问题
页:
[1]