xiaodao-spreader 0.1.27 → 0.1.29

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.
@@ -42,6 +42,7 @@ export interface SheetsOpsState {
42
42
  toolbarThemeVars: ComputedRef<Record<string, string>>;
43
43
  wrapperRef: Ref<HTMLDivElement | null>;
44
44
  canvasRef: Ref<HTMLCanvasElement | null>;
45
+ freezeCanvasRef: Ref<HTMLCanvasElement | null>;
45
46
  editInputRef: Ref<HTMLTextAreaElement | null>;
46
47
  formulaBarRef: Ref<HTMLTextAreaElement | null>;
47
48
  viewSize: {
@@ -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;
@@ -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(年份补当前年)
@@ -85,6 +85,11 @@ export interface SpreadsheetData {
85
85
  style?: CellStyle;
86
86
  };
87
87
  }
88
+ /** 冻结窗格状态:rows/cols 为冻结的行数/列数(0 表示该方向未冻结) */
89
+ export interface FreezePane {
90
+ rows: number;
91
+ cols: number;
92
+ }
88
93
  export interface SheetModelData {
89
94
  name: string;
90
95
  /** 表格级样式池:styles[0] 始终为默认空样式 {} */
@@ -103,6 +108,8 @@ export interface SheetModelData {
103
108
  colCount?: number;
104
109
  /** 工作表逻辑有效行数(0-based exclusive)。缺失时回退到默认 200 */
105
110
  rowCount?: number;
111
+ /** 冻结窗格状态;缺省视为未冻结 { rows: 0, cols: 0 } */
112
+ freeze?: FreezePane;
106
113
  }
107
114
  export interface SheetState {
108
115
  id: string;
@@ -123,6 +130,18 @@ export interface SheetState {
123
130
  colCount: number;
124
131
  /** 工作表逻辑有效行数(0-based exclusive)。随操作动态增长 */
125
132
  rowCount: number;
133
+ /** 冻结窗格状态(默认 { rows: 0, cols: 0 } 表示未冻结) */
134
+ freeze: FreezePane;
135
+ }
136
+ /** 视口区域:冻结窗格将画布划分为四个独立滚动区域 */
137
+ export interface ViewportRegion {
138
+ kind: 'corner' | 'rows' | 'columns' | 'body';
139
+ x: number;
140
+ y: number;
141
+ width: number;
142
+ height: number;
143
+ scrollLeft: number;
144
+ scrollTop: number;
126
145
  }
127
146
  export interface UndoSnapshot {
128
147
  cells: Record<string, CellData>;