找回密码
 立即注册

QQ登录

只需一步,快速开始

齐天大猫

金牌服务用户

48

主题

130

帖子

440

积分

金牌服务用户

积分
440
齐天大猫
金牌服务用户   /  发表于:2023-2-9 17:12  /   查看:3567  /  回复:13
本帖最后由 Lynn.Dou 于 2023-3-29 18:58 编辑

在实际应用场景中,因为数据的数据结构是不固定的,我们会应用gc的JsonDataSource对象进行进行数据绑定,但是在使用时只能传入字符串类型数据,这时Date和Timestamp类型数据就只能转化成字符串类型数据了。如果在我们这种数据结构不固定的应用场景,想返回时间类型数据而非字符串类型数据有什么解决方案呢???


gcexcel使用流程:
1、gc反序列化(json使用模板配置,不包含表真实数据:template = this.designer.getWorkbook().toJSON({includeBindingSource: false}))
2、初始化数据(实时查询数据)
3、数据绑定
4、gc计算
5、gc序列化

代码如下:
  1. Workbook workbook = new Workbook();
  2.             InputStream templateFile = getResourceStream("shujugeshi.json");

  3.             //加载模板,gc反序列化
  4.             workbook.fromJson(templateFile);
  5.             IWorksheets sheets = workbook.getWorksheets();

  6.             Map<IWorksheet, List<ITable>> tables = Maps.newHashMap();
  7.             Map<String, JsonDataSource> sheetDatasources = Maps.newHashMap();
  8.             //收集所有table
  9.             for (IWorksheet sheet : sheets) {
  10.                 for (ITable table : sheet.getTables()) {
  11.                     List<ITable> sheetTables = tables.computeIfAbsent(sheet, item -> Lists.newArrayList());
  12.                     sheetTables.add(table);
  13.                 }
  14.             }

  15.             Map<String, List<Map<String, Object>>> datasourceMap = Maps.newHashMap();
  16.             List<Map<String,Object>> data = new ArrayList<>();
  17.             //初始化数据
  18.             Map<String,Object> data1 = Maps.newHashMap();
  19.             data.add(data1);
  20.             DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  21.             Date d1 = new Date();

  22.             //操作日期:Date类型
  23.             //日期:String类型
  24.             //分子:Integer
  25.             //分母:Integer
  26.             //dt:TimeStamp

  27.             String d2 = "2023-02-09";
  28.             Integer d3 = 1;
  29.             Integer d4 = 1;
  30.             Timestamp d5 = new Timestamp(System.currentTimeMillis());
  31.             data1.put("操作日期",d1);
  32.             data1.put("日期",d2);
  33.             data1.put("分子",d3);
  34.             data1.put("分母",d4);
  35.             data1.put("dt",d5);

  36.             datasourceMap.put("S_Sheet1_tableRecords_0_0",data);

  37. <font color="#ff0000">            /** 问题: 这里的方法Date和Timestamp类型数据只能转化成字符串类型。在我们这种数据类型不固定的情况下。如果想返回时间类型有什么方案?**/</font>
  38. //            String jsonDatasource = JSONObject.toJSON(datasourceMap).toString();
  39. <font color="#ff0000">            String jsonDatasource =  JSONObject.toJSONStringWithDateFormat(datasourceMap,"yyyy-MM-dd HH:mm:ss");</font>
  40.             sheetDatasources.put("Sheet1",new JsonDataSource(jsonDatasource));

  41.             //关闭计算
  42.             workbook.setEnableCalculation(false);
  43.             //绑定数据
  44.             for (Map.Entry<IWorksheet, List<ITable>> e : tables.entrySet()) {
  45.                 IWorksheet sheet = e.getKey();
  46.                 sheet.setDataSource(sheetDatasources.get(sheet.getName()));
  47.                 for (ITable table : e.getValue()) {
  48.                     table.setBindingPath(table.getName());
  49.                 }
  50.             }
  51.             workbook.setEnableCalculation(true);
  52.             //序列化
  53.             String jsonResult = workbook.toJson();
  54.             saveToLocal(jsonResult,"数据类型.json");
复制代码


13 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-2-9 18:23:40
沙发
您好,这边需要一定时间调研下看是否实现您的需求。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-2-10 10:00:56
板凳
GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例变量等方式绑定数据源。这两种方式可以是任意数据类型,包括您说的时间类型数据。
另外,您给的demo中代码不完整,不是很明白您代码中jsonDataSource相关逻辑。如果您这边还想使用jsonDataSource,建议上传下完整代码及代码说明。
image.png349134215.png
回复 使用道具 举报
齐天大猫
金牌服务用户   /  发表于:2023-2-10 10:50:38
地板
Ellia.Duan 发表于 2023-2-10 10:00
GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例,变量等方式绑定数据 ...

已上传,DataBindTest这个类

gc.zip

14.32 MB, 下载次数: 264

回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-2-10 16:10:44
5#
齐天大猫 发表于 2023-2-10 10:50
已上传,DataBindTest这个类

这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象来完成数据绑定
https://demo.grapecity.com.cn/do ... /demos/customobject
回复 使用道具 举报
齐天大猫
金牌服务用户   /  发表于:2023-2-10 16:47:50
6#
Ellia.Duan 发表于 2023-2-10 16:10
这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象 ...

因为我们查询结果的数据结构是不固定的,所以无法使用自定义对象呢,这种有什么办法吗?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-2-10 17:07:51
7#
请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。
回复 使用道具 举报
齐天大猫
金牌服务用户   /  发表于:2023-2-10 17:23:42
8#
Ellia.Duan 发表于 2023-2-10 17:07
请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。

首先模板就是不固定的呢,用户会根据配置不同的表,excel中表字段和字段类型都是不固定的,所以之前我们采用的是JsonDataSource这种方式进行绑定的。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-2-10 17:45:33
9#
感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类型,本身json数据只支持String、Number 和Boolean 类型的值
回复 使用道具 举报
齐天大猫
金牌服务用户   /  发表于:2023-2-10 18:38:44
10#
Ellia.Duan 发表于 2023-2-10 17:45
感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类 ...

嗯嗯 主要是表结构是不固定的,这种情况后续会不会有什么解决方案呢?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部