御灵 发表于 2024-11-11 15:25:59

[17.1.5]筛选顺序问题

本帖最后由 Joestar.Xu 于 2024-11-14 14:56 编辑

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

Richard.Ma 发表于 2024-11-11 16:43:57

本帖最后由 Richard.Ma 于 2024-11-11 16:45 编辑

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

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

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


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

GC.Spread.Sheets.Filter.HideRowFilter.ListValueCompareFn = function (a, b) {
    let dataTypePriority = { date: 0, number: 1, string: 2, boolean: 3, blank: 4 };
    let aValue = a.value, bValue = b.value, aValueType = a.type, bValueType = b.type;
    if (aValueType !== bValueType) {
      if (dataTypePriority < dataTypePriority) {
            return -1;
      }
      return 1;
    }
    if (aValueType === 'date' && bValueType === 'date') {
      let aYear = aValue.getFullYear(), bYear = bValue.getFullYear();
      if (aYear < bYear) {
            return -1;
      } else if (aYear > bYear) {
            return 1;
      }
    }
    if (aValueType === 'string' && bValueType === 'string') {
      aValue = aValue.toLowerCase();
      bValue = bValue.toLowerCase();
    }
    if (aValue > bValue) {
      return 1;
    }
    return aValue < bValue ? -1 : 0;
}


页: [1]
查看完整版本: [17.1.5]筛选顺序问题