xiaodao-spreader 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ZH.md +168 -58
- package/README.md +168 -58
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/components/filter-popup.vue.d.ts +30 -0
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +6 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +44 -1
- package/dist/types/components/spreader/composables/interactions.d.ts +8 -0
- package/dist/types/components/spreader/core/autofill.d.ts +125 -0
- package/dist/types/components/spreader/core/constants.d.ts +2 -0
- package/dist/types/components/spreader/core/filter-core.d.ts +29 -0
- package/dist/types/components/spreader/core/number-format.d.ts +6 -0
- package/dist/types/components/spreader/core/types.d.ts +32 -0
- package/dist/xiaodao-spreader.es.js +6902 -5450
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +1 -1
|
@@ -29,6 +29,10 @@ type __VLS_Props = {
|
|
|
29
29
|
sortMenuOpen: boolean;
|
|
30
30
|
cachedSortOrder: SortOrder;
|
|
31
31
|
canSort: boolean;
|
|
32
|
+
/** 工具栏「筛选」按钮是否可用(单选合并单元格且无筛选态时禁用) */
|
|
33
|
+
canFilter: boolean;
|
|
34
|
+
/** 当前 worksheet 是否已启用筛选 */
|
|
35
|
+
filterActive: boolean;
|
|
32
36
|
selHAlign: string;
|
|
33
37
|
selVAlign: string;
|
|
34
38
|
selWrap: boolean;
|
|
@@ -70,6 +74,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
70
74
|
"calc-count": () => void;
|
|
71
75
|
"increase-decimals": () => void;
|
|
72
76
|
"decrease-decimals": () => void;
|
|
77
|
+
"toggle-filter": () => void;
|
|
73
78
|
"font-family-change": (v: string | number) => void;
|
|
74
79
|
"font-size-change": (v: string | number) => void;
|
|
75
80
|
"h-align-change": (v: string | number) => void;
|
|
@@ -115,6 +120,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
115
120
|
"onCalc-count"?: (() => any) | undefined;
|
|
116
121
|
"onIncrease-decimals"?: (() => any) | undefined;
|
|
117
122
|
"onDecrease-decimals"?: (() => any) | undefined;
|
|
123
|
+
"onToggle-filter"?: (() => any) | undefined;
|
|
118
124
|
"onFont-family-change"?: ((v: string | number) => any) | undefined;
|
|
119
125
|
"onFont-size-change"?: ((v: string | number) => any) | undefined;
|
|
120
126
|
"onH-align-change"?: ((v: string | number) => any) | undefined;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ComputedRef, type Ref } from 'vue';
|
|
2
2
|
import { FormulaDeps } from '../core/formula';
|
|
3
|
-
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion } from '../core/types';
|
|
3
|
+
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion, SheetFilter, FilterColumn } from '../core/types';
|
|
4
|
+
import { type FilterCandidates } from '../core/filter-core';
|
|
4
5
|
/** 选区触发方式,影响「合并单元格是否扩大选区」。
|
|
5
6
|
* - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
|
|
6
7
|
* - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
|
|
@@ -8,6 +9,14 @@ import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, Borde
|
|
|
8
9
|
* - 'all' :左上角全选按钮 → expandSelectionForMerges 行为
|
|
9
10
|
*/
|
|
10
11
|
export type SelectionMode = 'cell' | 'row' | 'col' | 'all';
|
|
12
|
+
/** AutoFill 拖拽状态 */
|
|
13
|
+
export interface AutoFillState {
|
|
14
|
+
active: boolean;
|
|
15
|
+
sourceRange: SelectionRange | null;
|
|
16
|
+
targetRange: SelectionRange | null;
|
|
17
|
+
direction: 'up' | 'down' | 'left' | 'right' | null;
|
|
18
|
+
preview: boolean;
|
|
19
|
+
}
|
|
11
20
|
export interface CoreState {
|
|
12
21
|
props: {
|
|
13
22
|
rowCount: number;
|
|
@@ -49,6 +58,36 @@ export interface CoreState {
|
|
|
49
58
|
setFreeze: (rows: number, cols: number) => void;
|
|
50
59
|
clearFreeze: () => void;
|
|
51
60
|
getFreeze: () => FreezePane;
|
|
61
|
+
filter: Ref<SheetFilter | null>;
|
|
62
|
+
getFilter: () => SheetFilter | null;
|
|
63
|
+
setFilter: (f: SheetFilter | null, silent?: boolean) => void;
|
|
64
|
+
enableFilter: (range: SelectionRange) => void;
|
|
65
|
+
clearFilter: () => void;
|
|
66
|
+
clearFilterColumn: (col: number) => void;
|
|
67
|
+
setFilterColumn: (col: number, colFilter: FilterColumn | null) => void;
|
|
68
|
+
/** 获取某列候选值列表(级联:仅统计其它列已筛选后的可见行) */
|
|
69
|
+
getColumnCandidates: (col: number) => FilterCandidates;
|
|
70
|
+
/** 探测数据实际占用范围(有值或样式的单元格包围盒);无数据返回 null */
|
|
71
|
+
getDataRange: () => SelectionRange | null;
|
|
72
|
+
/** 探测以 anchor 为中心的「当前数据区域」(连续非空单元格块);空 anchor 返回 null */
|
|
73
|
+
getCurrentRegion: (anchorC: number, anchorR: number) => SelectionRange | null;
|
|
74
|
+
/** 自动检测筛选范围:多选选区优先,否则以 active cell 当前区域推断;完全无数据返回 null */
|
|
75
|
+
detectFilterRange: () => SelectionRange | null;
|
|
76
|
+
/** 切换 AutoFilter:无则创建(自动检测范围),有则移除整个 AutoFilter */
|
|
77
|
+
toggleAutoFilter: () => void;
|
|
78
|
+
/** 某列是否落在当前 AutoFilter Range 内(决定表头箭头是否绘制) */
|
|
79
|
+
isColumnInFilterRange: (col: number) => boolean;
|
|
80
|
+
/** 当前 AutoFilter Range(无则 null) */
|
|
81
|
+
getFilterRange: () => SelectionRange | null;
|
|
82
|
+
/** 是否已启用 AutoFilter */
|
|
83
|
+
isFilterEnabled: () => boolean;
|
|
84
|
+
/** 某列是否已应用筛选条件(用于高亮箭头图标) */
|
|
85
|
+
isFilterColumnActive: (col: number) => boolean;
|
|
86
|
+
isRowHidden: (r: number) => boolean;
|
|
87
|
+
getFilteredOutRows: () => Set<number>;
|
|
88
|
+
getVisibleRowCount: () => number;
|
|
89
|
+
getVisibleRowAt: (index: number) => number;
|
|
90
|
+
getVisibleRowIndex: (row: number) => number;
|
|
52
91
|
/** 基于真实行高/列宽计算冻结区域尺寸 */
|
|
53
92
|
getFrozenMetrics: () => {
|
|
54
93
|
frozenRowsHeight: number;
|
|
@@ -156,6 +195,10 @@ export interface CoreState {
|
|
|
156
195
|
clampScroll?: (sx: number | null, sy: number | null) => void;
|
|
157
196
|
/** 查找高亮钩子:返回某单元格当前的高亮类型(由 find-replace 模块注入) */
|
|
158
197
|
findHighlight?: (col: number, row: number) => 'active' | 'match' | null;
|
|
198
|
+
/** AutoFill 拖拽状态:active 时 render 绘制预览,mouseup 触发 applyAutoFill */
|
|
199
|
+
autoFillState: Ref<AutoFillState>;
|
|
200
|
+
/** 一次性提交 AutoFill:saveUndo → ensureCapacity → applyAutoFillPlan → 写入 cells + formulaDeps → selectRange → scheduleRender */
|
|
201
|
+
applyAutoFill: (sourceRange: SelectionRange, targetRange: SelectionRange, direction: 'up' | 'down' | 'left' | 'right') => void;
|
|
159
202
|
}
|
|
160
203
|
export declare function createCoreState(rawProps: {
|
|
161
204
|
rowCount?: number;
|
|
@@ -39,6 +39,14 @@ export interface InteractionsState {
|
|
|
39
39
|
onRowHdrCtx: (e: MouseEvent, row: number) => void;
|
|
40
40
|
onColHdrCtx: (e: MouseEvent, col: number) => void;
|
|
41
41
|
onCellCtx: (e: MouseEvent, c: number, r: number) => void;
|
|
42
|
+
filterPopup: Ref<{
|
|
43
|
+
col: number;
|
|
44
|
+
x: number;
|
|
45
|
+
y: number;
|
|
46
|
+
} | null>;
|
|
47
|
+
isFilterButtonHit: (x: number, y: number) => number;
|
|
48
|
+
openFilterPopup: (col: number) => void;
|
|
49
|
+
closeFilterPopup: () => void;
|
|
42
50
|
dimInputRef: Ref<HTMLInputElement | null>;
|
|
43
51
|
dimPanel: Ref<{
|
|
44
52
|
type: 'row' | 'col';
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { CellCoord, SelectionRange } from './types';
|
|
2
|
+
export type FillValue = {
|
|
3
|
+
kind: 'number';
|
|
4
|
+
num: number;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'text';
|
|
7
|
+
text: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'text-number';
|
|
10
|
+
prefix: string;
|
|
11
|
+
num: number;
|
|
12
|
+
digits: number;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'date';
|
|
15
|
+
serial: number;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'formula';
|
|
18
|
+
formula: string;
|
|
19
|
+
};
|
|
20
|
+
export type FillPattern = {
|
|
21
|
+
kind: 'copy';
|
|
22
|
+
sourceValues: FillValue[];
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'linear';
|
|
25
|
+
step: number;
|
|
26
|
+
base: number;
|
|
27
|
+
sourceLen: number;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'text-number';
|
|
30
|
+
prefix: string;
|
|
31
|
+
step: number;
|
|
32
|
+
base: number;
|
|
33
|
+
digits: number;
|
|
34
|
+
sourceLen: number;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'date-linear';
|
|
37
|
+
step: number;
|
|
38
|
+
baseSerial: number;
|
|
39
|
+
sourceLen: number;
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'text-series';
|
|
42
|
+
step: number;
|
|
43
|
+
baseCharCode: number;
|
|
44
|
+
sourceLen: number;
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'formula';
|
|
47
|
+
};
|
|
48
|
+
export interface AutofillSheetLike {
|
|
49
|
+
cells: Record<string, {
|
|
50
|
+
value: string;
|
|
51
|
+
styleId?: number;
|
|
52
|
+
}>;
|
|
53
|
+
styles: ReadonlyArray<unknown>;
|
|
54
|
+
}
|
|
55
|
+
export interface FillResult {
|
|
56
|
+
cells: Record<string, {
|
|
57
|
+
value: string;
|
|
58
|
+
styleId?: number;
|
|
59
|
+
}>;
|
|
60
|
+
merges: Record<string, {
|
|
61
|
+
startCol: number;
|
|
62
|
+
startRow: number;
|
|
63
|
+
endCol: number;
|
|
64
|
+
endRow: number;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 将单元格原始值解析为 FillValue。
|
|
69
|
+
* 优先级:公式 → 日期 → 文本+数字 → 纯数字 → 纯文本。
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseFillValue(value: string, locale: string): FillValue;
|
|
72
|
+
/**
|
|
73
|
+
* 由源值序列推断填充模式。
|
|
74
|
+
* - 任一公式 → formula
|
|
75
|
+
* - 全为日期 → date-linear
|
|
76
|
+
* - 全为纯数字:单值 copy;多值等差 linear;非等差 copy
|
|
77
|
+
* - 全为文本+数字且 prefix 相同:单值 copy;多值等差 text-number;否则 copy
|
|
78
|
+
* - 全为单字符 ASCII 字母且 charCode 等差 → text-series
|
|
79
|
+
* - 其余 → copy
|
|
80
|
+
*/
|
|
81
|
+
export declare function inferFillPattern(sourceValues: FillValue[]): FillPattern;
|
|
82
|
+
/**
|
|
83
|
+
* 生成目标区域第 index 个(0-based,相对目标起点、靠近源的一端)的填充值(正向:下/右)。
|
|
84
|
+
* 目标第 index 个的逻辑索引为 sourceLen + index。
|
|
85
|
+
*/
|
|
86
|
+
export declare function generateFillValue(pattern: FillPattern, index: number, sourceLen: number): FillValue;
|
|
87
|
+
/**
|
|
88
|
+
* 将 FillValue 转为单元格数据(value + 透传源 styleId)。
|
|
89
|
+
* 日期存序列号字符串,渲染时由 numberFormat 格式化。
|
|
90
|
+
*/
|
|
91
|
+
export declare function fillValueToCellData(fv: FillValue, sourceStyleId?: number): {
|
|
92
|
+
value: string;
|
|
93
|
+
styleId?: number;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* 根据源选区与拖拽目标格计算目标区域及方向。
|
|
97
|
+
* 落在源内返回 null。
|
|
98
|
+
*/
|
|
99
|
+
export declare function computeTargetRange(sourceRange: SelectionRange, draggedCell: CellCoord): {
|
|
100
|
+
targetRange: SelectionRange;
|
|
101
|
+
direction: 'up' | 'down' | 'left' | 'right';
|
|
102
|
+
} | null;
|
|
103
|
+
/**
|
|
104
|
+
* 平移公式引用以适配目标单元格($ 绝对引用由 shiftFormulaRefs 处理)。
|
|
105
|
+
*/
|
|
106
|
+
export declare function translateFormulaForTarget(sourceFormula: string, sourceCell: CellCoord, targetCell: CellCoord, colCount: number, rowCount: number, colToLabelFn: (col: number) => string): string;
|
|
107
|
+
/**
|
|
108
|
+
* 校验源/目标区域与已有合并的兼容性:
|
|
109
|
+
* - 源区域不能与任何 merge 部分相交(要么完全包含,要么不相交);
|
|
110
|
+
* - 目标区域不能与任何已有 merge 相交(会破坏 merge)。
|
|
111
|
+
*/
|
|
112
|
+
export declare function validateMergeCompatibility(sourceRange: SelectionRange, targetRange: SelectionRange, merges: Record<string, SelectionRange>): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* 自动填充核心:根据源/目标区域与方向生成填充增量(纯函数,不 mutate sheet)。
|
|
115
|
+
* - down/right:正向延伸;up/left:反向延伸。
|
|
116
|
+
* - 公式按源位置循环并平移引用;其余按模式生成。
|
|
117
|
+
* - merges 暂返回空对象(merge 复制由后续任务决定)。
|
|
118
|
+
*/
|
|
119
|
+
export declare function applyAutoFillPlan(sourceRange: SelectionRange, targetRange: SelectionRange, sheet: {
|
|
120
|
+
cells: Record<string, {
|
|
121
|
+
value: string;
|
|
122
|
+
styleId?: number;
|
|
123
|
+
}>;
|
|
124
|
+
styles?: ReadonlyArray<unknown>;
|
|
125
|
+
}, direction: 'up' | 'down' | 'left' | 'right', locale: string, colCount: number, rowCount: number, colToLabelFn: (col: number) => string): FillResult;
|
|
@@ -10,6 +10,8 @@ export declare const MAX_ROW_HEIGHT = 500;
|
|
|
10
10
|
export declare const SB_SIZE = 11;
|
|
11
11
|
export declare const ARROW_SIZE = 11;
|
|
12
12
|
export declare const SCROLL_STEP = 50;
|
|
13
|
+
export declare const FILL_HANDLE_SIZE = 6;
|
|
14
|
+
export declare const FILL_HANDLE_HIT_PADDING = 4;
|
|
13
15
|
export declare const UNDO_MAX = 50;
|
|
14
16
|
export declare const i18n: Record<string, Record<string, string>>;
|
|
15
17
|
export declare function t(locale: string, key: string): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SheetFilter, FilterColumn } from './types';
|
|
2
|
+
/** 空白哨兵:值列表中用此字符串表示「空白」项(原始空值无法作为 map key 区分) */
|
|
3
|
+
export declare const FILTER_BLANK = "__filter_blank__";
|
|
4
|
+
/** 单元格读取抽象:供引擎从任意数据源(core-state / 测试)取值与格式 */
|
|
5
|
+
export interface FilterCellAccessor {
|
|
6
|
+
/** 返回单元格原始值(string);公式结果请在此展开 */
|
|
7
|
+
getValue: (col: number, row: number) => string;
|
|
8
|
+
/** 返回单元格数字格式(用于展示与类型判定) */
|
|
9
|
+
getFormat: (col: number, row: number) => string | undefined | null;
|
|
10
|
+
}
|
|
11
|
+
/** 取单元格展示文本(与渲染一致)。空值回退原始串避免丢失信息。 */
|
|
12
|
+
export declare function getDisplayValue(value: string, format: string | undefined | null, locale: string): string;
|
|
13
|
+
/** 按单列筛选定义判定单元格是否满足(值列表 / 条件) */
|
|
14
|
+
export declare function matchColumn(col: FilterColumn, value: string, format: string | undefined | null, locale: string): boolean;
|
|
15
|
+
/** 某行是否满足整张筛选(多列 AND) */
|
|
16
|
+
export declare function isRowVisible(filter: SheetFilter | null, row: number, acc: FilterCellAccessor, locale: string): boolean;
|
|
17
|
+
export interface FilterCandidates {
|
|
18
|
+
/** 候选值(展示字符串,已去重、稳定排序) */
|
|
19
|
+
values: string[];
|
|
20
|
+
/** 该列是否存在空白单元格 */
|
|
21
|
+
hasBlank: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 获取某列的候选值列表(级联:仅统计「其它列已筛选」后可见的行)。
|
|
25
|
+
* 排序:若全部可解析为数字则按数值升序;否则按 locale 文本(numeric)升序。
|
|
26
|
+
*/
|
|
27
|
+
export declare function getColumnCandidates(filter: SheetFilter, col: number, acc: FilterCellAccessor, locale: string): FilterCandidates;
|
|
28
|
+
/** 判断是否处于「该列已设置筛选」状态(用于图标高亮) */
|
|
29
|
+
export declare function isColumnFiltered(col: FilterColumn | undefined): boolean;
|
|
@@ -62,6 +62,7 @@ export interface NFOption {
|
|
|
62
62
|
export declare function parseNumberFormat(format: string): NFParsed;
|
|
63
63
|
/** 清空解析缓存(主要用于测试/资源释放) */
|
|
64
64
|
export declare function clearNumberFormatCache(): void;
|
|
65
|
+
export declare function serialToDate(serial: number): Date;
|
|
65
66
|
/**
|
|
66
67
|
* 将单元格原始字符串值按格式代码格式化为显示文本。
|
|
67
68
|
* 绝不修改传入的 value。
|
|
@@ -134,6 +135,11 @@ export interface DateTimeParseResult {
|
|
|
134
135
|
serial: number;
|
|
135
136
|
format: string;
|
|
136
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* 日期 → Excel 1900 系统序列号(与 serialToDate 互逆)。
|
|
140
|
+
* 1900-01-01 ~ 02-28 区间减 1,对齐 Excel 的 1900 虚构闰年(1900-02-29 = 60)。
|
|
141
|
+
*/
|
|
142
|
+
export declare function dateToSerial(y: number, m: number, d: number): number;
|
|
137
143
|
/**
|
|
138
144
|
* 对常规单元格的输入做常见日期/时间/日期时间字符串自动识别(对齐 Excel 输入语义):
|
|
139
145
|
* - 日期:yyyy-m-d、yyyy/m/d、yyyy年m月d日、m-d / m/d(年份补当前年)
|
|
@@ -90,6 +90,34 @@ export interface FreezePane {
|
|
|
90
90
|
rows: number;
|
|
91
91
|
cols: number;
|
|
92
92
|
}
|
|
93
|
+
/** 单列筛选类型 */
|
|
94
|
+
export type FilterColumnType = 'values' | 'text' | 'number' | 'date';
|
|
95
|
+
/** 条件筛选算子(文本 / 数字 / 日期通用,按 type 决定可用集合) */
|
|
96
|
+
export type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'blank' | 'notBlank';
|
|
97
|
+
/** 单列筛选条件(条件筛选模式) */
|
|
98
|
+
export interface FilterCondition {
|
|
99
|
+
operator: FilterOperator;
|
|
100
|
+
/** 比较值(文本/数字原始文本;日期为输入文本) */
|
|
101
|
+
value?: string;
|
|
102
|
+
/** 介于(between)的第二个值 */
|
|
103
|
+
value2?: string;
|
|
104
|
+
}
|
|
105
|
+
/** 单列筛选定义 */
|
|
106
|
+
export interface FilterColumn {
|
|
107
|
+
/** 筛选类型:值列表 / 文本条件 / 数字条件 / 日期条件 */
|
|
108
|
+
type: FilterColumnType;
|
|
109
|
+
/** 值列表模式下选中的值(可能包含 FILTER_BLANK 哨兵表示空白);为空表示不过滤 */
|
|
110
|
+
values?: string[];
|
|
111
|
+
/** 条件模式下生效 */
|
|
112
|
+
condition?: FilterCondition;
|
|
113
|
+
}
|
|
114
|
+
/** 工作表筛选状态:独立存储,不写入 cell style / data */
|
|
115
|
+
export interface SheetFilter {
|
|
116
|
+
/** 筛选区域(含表头行)。startRow 通常为表头行,数据行为 startRow+1..endRow */
|
|
117
|
+
range: SelectionRange;
|
|
118
|
+
/** 按列索引(0-based)存储的列筛选;缺失的列表示不过滤 */
|
|
119
|
+
columns: Record<number, FilterColumn>;
|
|
120
|
+
}
|
|
93
121
|
export interface SheetModelData {
|
|
94
122
|
name: string;
|
|
95
123
|
/** 表格级样式池:styles[0] 始终为默认空样式 {} */
|
|
@@ -110,6 +138,8 @@ export interface SheetModelData {
|
|
|
110
138
|
rowCount?: number;
|
|
111
139
|
/** 冻结窗格状态;缺省视为未冻结 { rows: 0, cols: 0 } */
|
|
112
140
|
freeze?: FreezePane;
|
|
141
|
+
/** 数据筛选状态;缺省视为未启用筛选 */
|
|
142
|
+
filter?: SheetFilter;
|
|
113
143
|
}
|
|
114
144
|
export interface SheetState {
|
|
115
145
|
id: string;
|
|
@@ -132,6 +162,8 @@ export interface SheetState {
|
|
|
132
162
|
rowCount: number;
|
|
133
163
|
/** 冻结窗格状态(默认 { rows: 0, cols: 0 } 表示未冻结) */
|
|
134
164
|
freeze: FreezePane;
|
|
165
|
+
/** 数据筛选状态;缺省为 null 表示未启用筛选 */
|
|
166
|
+
filter: SheetFilter | null;
|
|
135
167
|
}
|
|
136
168
|
/** 视口区域:冻结窗格将画布划分为四个独立滚动区域 */
|
|
137
169
|
export interface ViewportRegion {
|