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导入模板后,直接绑定数据即可
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需要注册字体的问题
|
|