dexteryao 发表于 2020-6-2 10:29:27

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]
查看完整版本: SpreadJS + GCExcel实现服务端数据绑定