找回密码
 立即注册

QQ登录

只需一步,快速开始

御灵

金牌服务用户

15

主题

39

帖子

128

积分

金牌服务用户

积分
128
御灵
金牌服务用户   /  发表于:2024-11-11 15:25  /   查看:120  /  回复:1
1金币
本帖最后由 Joestar.Xu 于 2024-11-14 14:56 编辑

image.png519622802.png 图一:筛选框顺序   image.png875071716.png 图二:实际数据顺序  筛选框的顺序和我实际的顺序不一致,怎么解决呢?

1 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-11-11 16:43:57
沙发
本帖最后由 Richard.Ma 于 2024-11-11 16:45 编辑

筛选列表的显示肯定是需要对数据先进行分组。然后才得到筛选项

分组的结果实际上和对数据正序排序的结果是一样的,如果你需要自定义筛选项顺序。可以重写我们暴露出来的GC.Spread.Sheets.Filter.HideRowFilter.ListValueCompareFn方法。一个简单的重写示例如下

注:下面的代码仅为针对的是对日期筛选项排序的场景,ListValueCompareFn重写的简单示例。
       并不是针对于你这个场景的,实际上按照你的需求,要求过滤和你的数据行里面的顺序完全相同,你得先考虑对数据行里面的这列的单元格值数组去重,得到不重复的一个数组。然后再以此为排序基准。来在ListValueCompareFn中判断应该返回1或者-1


  1. var spread = new GC.Spread.Sheets.Workbook("ss");
  2. var sheet = spread.getActiveSheet();
  3. spread.suspendPaint();
  4. for (var row = 1; row < 50; row++) {
  5.     sheet.setValue(row, 1, new Date(2020 + row, row, 1));
  6. }
  7. sheet.setColumnWidth(1, 200);
  8. sheet.rowFilter(new GC.Spread.Sheets.Filter.HideRowFilter(new GC.Spread.Sheets.Range(1, 1, 50, 1)));
  9. spread.resumePaint();

  10. GC.Spread.Sheets.Filter.HideRowFilter.ListValueCompareFn = function (a, b) {
  11.     let dataTypePriority = { date: 0, number: 1, string: 2, boolean: 3, blank: 4 };
  12.     let aValue = a.value, bValue = b.value, aValueType = a.type, bValueType = b.type;
  13.     if (aValueType !== bValueType) {
  14.         if (dataTypePriority[aValueType] < dataTypePriority[bValueType]) {
  15.             return -1;
  16.         }
  17.         return 1;
  18.     }
  19.     if (aValueType === 'date' && bValueType === 'date') {
  20.         let aYear = aValue.getFullYear(), bYear = bValue.getFullYear();
  21.         if (aYear < bYear) {
  22.             return -1;
  23.         } else if (aYear > bYear) {
  24.             return 1;
  25.         }
  26.     }
  27.     if (aValueType === 'string' && bValueType === 'string') {
  28.         aValue = aValue.toLowerCase();
  29.         bValue = bValue.toLowerCase();
  30.     }
  31.     if (aValue > bValue) {
  32.         return 1;
  33.     }
  34.     return aValue < bValue ? -1 : 0;
  35. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部