【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");
您好,这边需要一定时间调研下看是否实现您的需求。 GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例,变量等方式绑定数据源。这两种方式可以是任意数据类型,包括您说的时间类型数据。
另外,您给的demo中代码不完整,不是很明白您代码中jsonDataSource相关逻辑。如果您这边还想使用jsonDataSource,建议上传下完整代码及代码说明。
Ellia.Duan 发表于 2023-2-10 10:00
GcExcel中数据绑定 除json方式绑定数据外,还有其他方式,如java.sql.ResultSet的实例,变量等方式绑定数据 ...
已上传,DataBindTest这个类
齐天大猫 发表于 2023-2-10 10:50
已上传,DataBindTest这个类
这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象来完成数据绑定
https://demo.grapecity.com.cn/documents-api-excel-java/demos/customobject Ellia.Duan 发表于 2023-2-10 16:10
这边看了您的模板和您填充的数据后,不建议您使用jsonDataSource进行数据绑定,您完全可以使用自定义对象 ...
因为我们查询结果的数据结构是不固定的,所以无法使用自定义对象呢,这种有什么办法吗? 请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。
Ellia.Duan 发表于 2023-2-10 17:07
请您大概描述下您的数据结构类型或者造一份假数据,这边帮您看下有什么方案。
首先模板就是不固定的呢,用户会根据配置不同的表,excel中表字段和字段类型都是不固定的,所以之前我们采用的是JsonDataSource这种方式进行绑定的。 感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类型,本身json数据只支持String、Number 和Boolean 类型的值
Ellia.Duan 发表于 2023-2-10 17:45
感觉您数据绑定结构较为复杂,如果要使用JsonDataSource这种方式进行绑定的话,不支持绑定除字符串之外的类 ...
嗯嗯 主要是表结构是不固定的,这种情况后续会不会有什么解决方案呢?
页:
[1]
2