找回密码
 立即注册

QQ登录

只需一步,快速开始

funnychen

注册会员

6

主题

23

帖子

57

积分

注册会员

积分
57
最新发帖
funnychen
注册会员   /  发表于:2024-10-25 17:10  /   查看:364  /  回复:14
1金币
1. 使用单元格绑定时,某个单元格是日期选择器,选择某个日期后,获取 datasource 发现值为 "/OADate(45575.70532407407)/" 有什么方式可以做些格式化,比如 YYYY-MM-DD 格式
image.png162028807.png



2. 使用表格绑定数据源时,初始渲染数据可能只有一行,绑定后会有多行,比如我在第一行给某些单元设置了一些样式,比如:水印/文本格式/下拉选择器等,绑定渲染完成后,表格中只有一行有样式,剩下的几行没有应用样式,有什么方式可以在绑定的时候就做好嘛?
image.png357744750.png


最佳答案

查看完整内容

建议在getDataSource后对OADate做转换(可以根据业务选择在前端或后端处理),然后将转换后的数据源存在数据库等,后续setDataSource也不会受影响。 参考链接: https://gcdn.grapecity.com.cn/showtopic-137485-1-1.html

14 个回复

倒序浏览
最佳答案
最佳答案
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-10-25 17:10:52
来自 8#
建议在getDataSource后对OADate做转换(可以根据业务选择在前端或后端处理),然后将转换后的数据源存在数据库等,后续setDataSource也不会受影响。
参考链接:
https://gcdn.grapecity.com.cn/showtopic-137485-1-1.html
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-28 12:06:07
2#
您好!向您解答下您关心的问题。

问题1:如下动图所示,我们在17.1.1版本测试,未能复现问题现象。如果我们的操作与您不一致,需要您详细介绍下。
getDateSource问题未复现.gif

问题2:可以通过为Table列设置样式实现,可以参考如下代码:
  1. var style = new GC.Spread.Sheets.Style();
  2. //  设置style的样式属性
  3. ......
  4. // 设置列样式
  5. sheet.setStyle(row, col, style, GC.Spread.Sheets.SheetArea.viewport);
复制代码

回复 使用道具 举报
funnychen
注册会员   /  发表于:2024-10-28 15:46:47
3#
您好,关于问题1,需要通过日期选择期,重新选择下日期后,再获取 dataSource
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-28 17:29:33
4#
funnychen 发表于 2024-10-28 15:46
您好,关于问题1,需要通过日期选择期,重新选择下日期后,再获取 dataSource

了解了,根据您的描述操作后复现了现象,您可以参考如下代码解析日期:
  1.   const dataStr = "/OADate(45593.020833333336)/";
  2.   //  正则表达式用于解析日期数值
  3.   const regex = /OADate\((\d+\.\d+)\)/;
  4.   const match = dataStr.match(regex);
  5.   if (match) {
  6.     const number = match[1];
  7.     console.log(number);
  8.     //  将日期数值转换为可读日期
  9.     const date = convertNumberToDate(number);
  10.     console.log(date);
  11.   }

  12. //  转换日期数值为可读日期
  13.   function convertNumberToDate(number) {
  14.     const baseDate = new Date(1899, 11, 30); // 1899 年 12 月 30 日
  15.     const days = Math.floor(number);
  16.     const timePart = number - days;
  17.     const hours = timePart * 24;
  18.     const date = new Date(baseDate.getTime() + days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000);
  19.     return date;
  20.   }
复制代码
回复 使用道具 举报
funnychen
注册会员   /  发表于:2024-10-31 13:57:16
5#
Wilson.Zhang 发表于 2024-10-28 17:29
了解了,根据您的描述操作后复现了现象,您可以参考如下代码解析日期:

有几个问题:
1. 为什么 baseDate 是 1899 / 12 / 30
2. 假如我想在重新选择日期的时候,调用这段代码设置到绑定的 dataSource 中需要如何实现,不然每次都需要循环遍历所有的数据来实现
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-31 17:14:23
6#
问题1:经调研了解到,Excel中日期系统默认基于1900年日期系统,基准日期为1900年1月1日。那么,为什么在4楼的日期字符串解析代码中以1899年12月30日为基准日期呢?这是因为允许输入小于1的小数作为日期,Excel把日期序列号小于1的部分按照一定比例映射到1899年12月30日之后的时间上,时Excel内部对日期和时间的数字表示方式导致的一种特殊现象。因此,在日期解析代码中以1899年12月30日为基准日期。

问题2:您是需要以数据绑定的方式将日期数据绑定到设置了日期选择器的单元格吗?如果是这样的话,将日期数据组织为如”2024-10-31“的字符串即可,如下动图所示:
数据绑定设日期.gif
回复 使用道具 举报
funnychen
注册会员   /  发表于:2024-10-31 17:37:17
7#
Wilson.Zhang 发表于 2024-10-31 17:14
问题1:经调研了解到,Excel中日期系统默认基于1900年日期系统,基准日期为1900年1月1日。那么,为什么在4 ...

关于问题2是这样子的,就是我初始的时候确实会以“2024-10-31”这种形式去做数据绑定,但是当我重新选择日期后,日期的值不是会变成 /OADate(xxx)/的形式嘛。所以我想在 datasource 变化的时候,可能有某些监听事件,当我知道这是个日期选择器做的改动,就直接做个 format 再更新到 datasource 里,这样我最终获取 datasource 的时候就很省力,直接 sheet.getDatasource() 就可以了,而不需要获取之后再修改里面的日期
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-11-4 08:59:12
9#
了解您的场景了,建议您参考4楼和8楼版主提供的解决方案,在getDataSource()后转换处理,处理时结合实际存库的数据类型需求即可,比较灵活。
回复 使用道具 举报
funnychen
注册会员   /  发表于:2024-11-5 09:55:57
10#
关于样式复制的我想再问下,当我使用 datasource 绑定表单/表格后,我想对每一列都复制第一行的数据,我看了下相关文档,好像只能手动去复制,比如使用 cellRange.setStyle(style),然后循环每一列(每列的样式可能不一样),有没有什么高性能一点的方式,目前测试下来,复制样式和不复制样式的情况下数据绑定,渲染时间相差还是挺大的,大概有 2.3 倍的差距
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部