齐天大猫 发表于 2023-2-9 17:12:38

【gcexcel 6.0.3】JsonDataSource时间类型数据绑定(DOCXLS-7874)

本帖最后由 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序列化

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

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

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

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

            //操作日期:Date类型
            //日期:String类型
            //分子:Integer
            //分母:Integer
            //dt:TimeStamp

            String d2 = "2023-02-09";
            Integer d3 = 1;
            Integer d4 = 1;
            Timestamp d5 = new Timestamp(System.currentTimeMillis());
            data1.put("操作日期",d1);
            data1.put("日期",d2);
            data1.put("分子",d3);
            data1.put("分母",d4);
            data1.put("dt",d5);

            datasourceMap.put("S_Sheet1_tableRecords_0_0",data);

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

            //关闭计算
            workbook.setEnableCalculation(false);
            //绑定数据
            for (Map.Entry<IWorksheet, List<ITable>> e : tables.entrySet()) {
                IWorksheet sheet = e.getKey();
                sheet.setDataSource(sheetDatasources.get(sheet.getName()));
                for (ITable table : e.getValue()) {
                  table.setBindingPath(table.getName());
                }
            }
            workbook.setEnableCalculation(true);
            //序列化
            String jsonResult = workbook.toJson();
            saveToLocal(jsonResult,"数据类型.json");

Ellia.Duan 发表于 2023-2-9 18:23:40

您好,这边需要一定时间调研下看是否实现您的需求。

Ellia.Duan 发表于 2023-2-10 10:00:56

GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例,变量等方式绑定数据源。这两种方式可以是任意数据类型,包括您说的时间类型数据。
另外,您给的demo中代码不完整,不是很明白您代码中jsonDataSource相关逻辑。如果您这边还想使用jsonDataSource,建议上传下完整代码及代码说明。

齐天大猫 发表于 2023-2-10 10:50:38

Ellia.Duan 发表于 2023-2-10 10:00
GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例,变量等方式绑定数据 ...

已上传,DataBindTest这个类

Ellia.Duan 发表于 2023-2-10 16:10:44

齐天大猫 发表于 2023-2-10 10:50
已上传,DataBindTest这个类

这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象来完成数据绑定
https://demo.grapecity.com.cn/documents-api-excel-java/demos/customobject

齐天大猫 发表于 2023-2-10 16:47:50

Ellia.Duan 发表于 2023-2-10 16:10
这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象 ...

因为我们查询结果的数据结构是不固定的,所以无法使用自定义对象呢,这种有什么办法吗?

Ellia.Duan 发表于 2023-2-10 17:07:51

请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。

齐天大猫 发表于 2023-2-10 17:23:42

Ellia.Duan 发表于 2023-2-10 17:07
请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。

首先模板就是不固定的呢,用户会根据配置不同的表,excel中表字段和字段类型都是不固定的,所以之前我们采用的是JsonDataSource这种方式进行绑定的。

Ellia.Duan 发表于 2023-2-10 17:45:33

感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类型,本身json数据只支持String、Number 和Boolean 类型的值

齐天大猫 发表于 2023-2-10 18:38:44

Ellia.Duan 发表于 2023-2-10 17:45
感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类 ...

嗯嗯 主要是表结构是不固定的,这种情况后续会不会有什么解决方案呢?
页: [1] 2
查看完整版本: 【gcexcel 6.0.3】JsonDataSource时间类型数据绑定(DOCXLS-7874)