@sl-material/sl-table-sheet 1.1.0-beta1 → 1.1.0-beta2

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.
Files changed (39) hide show
  1. package/{dist/core → core}/styles/dialog.d.ts +1 -1
  2. package/package.json +18 -41
  3. package/{dist/sl-table-sheet.cjs.js → sl-table-sheet.cjs.js} +2 -1
  4. package/{dist/sl-table-sheet.es.js → sl-table-sheet.es.js} +2 -1
  5. package/{dist/sl-table-sheet.umd.umd.js → sl-table-sheet.umd.umd.js} +2 -1
  6. package/README.md +0 -550
  7. package/dist/package.json +0 -42
  8. /package/{dist/config → config}/config.d.ts +0 -0
  9. /package/{dist/core → core}/Dialog.d.ts +0 -0
  10. /package/{dist/core → core}/SheetTabs.d.ts +0 -0
  11. /package/{dist/core → core}/SlTableSheet.d.ts +0 -0
  12. /package/{dist/core → core}/TableSheet.d.ts +0 -0
  13. /package/{dist/core → core}/Toolbar.d.ts +0 -0
  14. /package/{dist/core → core}/common.d.ts +0 -0
  15. /package/{dist/core → core}/excel/ExcelExporter.d.ts +0 -0
  16. /package/{dist/core → core}/excel/ExcelParser.d.ts +0 -0
  17. /package/{dist/core → core}/excel/index.d.ts +0 -0
  18. /package/{dist/core → core}/excel/parsers/CommentExtractor.d.ts +0 -0
  19. /package/{dist/core → core}/excel/parsers/HeaderDetector.d.ts +0 -0
  20. /package/{dist/core → core}/excel/parsers/StyleExtractor.d.ts +0 -0
  21. /package/{dist/core → core}/excel/types.d.ts +0 -0
  22. /package/{dist/core → core}/excel/utils/ColorConverter.d.ts +0 -0
  23. /package/{dist/core → core}/index.d.ts +0 -0
  24. /package/{dist/core → core}/managers/CellMarkManager.d.ts +0 -0
  25. /package/{dist/core → core}/managers/CustomComponentManager.d.ts +0 -0
  26. /package/{dist/core → core}/managers/EditorManager.d.ts +0 -0
  27. /package/{dist/core → core}/managers/EventManager.d.ts +0 -0
  28. /package/{dist/core → core}/processors/DataProcessor.d.ts +0 -0
  29. /package/{dist/core → core}/processors/StyleProcessor.d.ts +0 -0
  30. /package/{dist/core → core}/styles/index.d.ts +0 -0
  31. /package/{dist/core → core}/styles/toolbar.d.ts +0 -0
  32. /package/{dist/core → core}/types.d.ts +0 -0
  33. /package/{dist/core → core}/utils/DomUtils.d.ts +0 -0
  34. /package/{dist/core → core}/utils/index.d.ts +0 -0
  35. /package/{dist/data.d.ts → data.d.ts} +0 -0
  36. /package/{dist/index.d.ts → index.d.ts} +0 -0
  37. /package/{dist/index.umd.d.ts → index.umd.d.ts} +0 -0
  38. /package/{dist/locales → locales}/index.d.ts +0 -0
  39. /package/{dist/locales → locales}/test-zh-TW.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Dialog 样式
3
3
  */
4
- export declare const DIALOG_STYLES = "\n .sl-excel-find-replace-dialog {\n position: fixed;\n top: 80px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n font-size: 14px;\n color: var(--sl-text-color);\n pointer-events: auto;\n }\n\n .sl-excel-find-replace-container {\n background: white;\n border-radius: 8px;\n width: 500px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n animation: slideIn 0.2s ease-out;\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .sl-excel-find-replace-title {\n font-size: 16px;\n font-weight: 500;\n color: #303133;\n }\n\n .sl-excel-find-replace-body {\n padding: 16px;\n }\n\n .sl-excel-find-replace-group {\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-find-replace-label {\n display: block;\n min-width: 56px;\n margin-right: 8px;\n }\n\n .sl-excel-find-replace-checkbox {\n display: none;\n align-items: center;\n font-weight: normal;\n min-width: auto;\n margin-right: 0;\n }\n\n .sl-excel-find-replace-checkbox input {\n margin-right: 6px;\n }\n\n .sl-excel-find-replace-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n height: 32px;\n }\n\n .sl-excel-find-replace-input {\n width: 100%;\n padding: 0px 12px;\n border: 1px solid var(--sl-border-color);\n border-radius: 4px;\n height: 32px;\n }\n\n .sl-excel-find-replace-input:focus {\n outline: none;\n border-color: var(--sl-color-primary);\n }\n\n\n .sl-excel-find-replace-footer {\n padding: 0px 16px 16px 16px;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .sl-excel-find-replace-btn {\n padding: 6px 16px;\n border-radius: 4px;\n height: 32px;\n cursor: pointer;\n background: var(--sl-color-white);\n border: 1px solid var(--sl-border-color);\n }\n .sl-excel-find-replace-btn:hover{\n color:var(--sl-text-color-thridary)\n }\n\n .sl-excel-find-replace-btn-primary {\n background-color: var(--sl-color-primary);\n color: white;\n }\n\n .sl-excel-find-replace-btn-primary:hover {\n border-color: var(--sl-color-primary-light-3);\n background-color: var(--sl-color-primary-light-3);\n }\n\n .sl-excel-message-toast {\n height: 40px;\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-100px);\n padding: 11px 15px;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n z-index: 9999;\n opacity: 0;\n transition: all 0.3s ease-out;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-message-toast--info {\n background-color: var(--sl-color-info-light-9);\n border: 1px solid var(--sl-color-info-light-8);\n color: var(--sl-color-info);\n }\n\n .sl-excel-message-toast--success {\n background-color: var(--sl-color-success-light-9);\n border: 1px solid var(--sl-color-success-light-8);\n color: var(--sl-color-success);\n }\n\n .sl-excel-message-toast--warning {\n background-color: var(--sl-color-warning-light-9);\n border: 1px solid var(--sl-color-warning-light-8);\n color: var(--sl-color-warning);\n }\n\n .sl-excel-message-toast--error {\n background-color: var(--sl-color-error-light-9);\n border: 1px solid var(--sl-color-error-light-8);\n color: var(--sl-color-error);\n }\n\n .sl-excel-message-toast.show {\n transform: translateX(-50%) translateY(0);\n opacity: 1;\n }\n";
4
+ export declare const DIALOG_STYLES = "\n .sl-excel-find-replace-dialog {\n position: fixed;\n top: 80px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n font-size: 14px;\n color: var(--sl-text-color);\n pointer-events: auto;\n }\n\n .sl-excel-find-replace-container {\n background: white;\n border-radius: 8px;\n width: 500px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n animation: slideIn 0.2s ease-out;\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .sl-excel-find-replace-title {\n font-size: 16px;\n font-weight: 500;\n color: #303133;\n }\n\n .sl-excel-find-replace-body {\n padding: 16px;\n }\n\n .sl-excel-find-replace-group {\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-find-replace-label {\n display: block;\n min-width: 56px;\n margin-right: 8px;\n }\n\n .sl-excel-find-replace-checkbox {\n display: none;\n align-items: center;\n font-weight: normal;\n min-width: auto;\n margin-right: 0;\n }\n\n .sl-excel-find-replace-checkbox input {\n margin-right: 6px;\n }\n\n .sl-excel-find-replace-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n height: 32px;\n }\n\n .sl-excel-find-replace-input {\n width: 100%;\n padding: 0px 12px;\n border: 1px solid var(--sl-border-color);\n border-radius: 4px;\n height: 32px;\n }\n\n .sl-excel-find-replace-input:focus {\n outline: none;\n border-color: var(--sl-color-primary);\n }\n\n\n .sl-excel-find-replace-footer {\n padding: 0px 16px 16px 16px;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .sl-excel-find-replace-btn {\n padding: 6px 16px;\n border-radius: 4px;\n height: 32px;\n cursor: pointer;\n background: var(--sl-color-white);\n border: 1px solid var(--sl-border-color);\n }\n .sl-excel-find-replace-btn:hover{\n color:var(--sl-text-color-thridary)\n }\n\n .sl-excel-find-replace-btn-primary {\n background-color: var(--sl-color-primary);\n color: var(--sl-color-white);\n }\n\n .sl-excel-find-replace-btn-primary:hover {\n border-color: var(--sl-color-primary-light-3);\n background-color: var(--sl-color-primary-light-3);\n color:var(--sl-color-white);\n }\n\n .sl-excel-message-toast {\n height: 40px;\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-100px);\n padding: 11px 15px;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n z-index: 9999;\n opacity: 0;\n transition: all 0.3s ease-out;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-message-toast--info {\n background-color: var(--sl-color-info-light-9);\n border: 1px solid var(--sl-color-info-light-8);\n color: var(--sl-color-info);\n }\n\n .sl-excel-message-toast--success {\n background-color: var(--sl-color-success-light-9);\n border: 1px solid var(--sl-color-success-light-8);\n color: var(--sl-color-success);\n }\n\n .sl-excel-message-toast--warning {\n background-color: var(--sl-color-warning-light-9);\n border: 1px solid var(--sl-color-warning-light-8);\n color: var(--sl-color-warning);\n }\n\n .sl-excel-message-toast--error {\n background-color: var(--sl-color-error-light-9);\n border: 1px solid var(--sl-color-error-light-8);\n color: var(--sl-color-error);\n }\n\n .sl-excel-message-toast.show {\n transform: translateX(-50%) translateY(0);\n opacity: 1;\n }\n";
5
5
  export declare const DIALOG_STYLE_ID = "sl-excel-find-replace-styles";
package/package.json CHANGED
@@ -1,45 +1,29 @@
1
1
  {
2
2
  "name": "@sl-material/sl-table-sheet",
3
- "version": "1.1.0-beta1",
3
+ "version": "1.1.0-beta2",
4
4
  "description": "VTable 组件库 - 支持 npm 和 UMD",
5
- "main": "./dist/sl-table-sheet.cjs.js",
6
- "module": "./dist/sl-table-sheet.es.js",
7
- "types": "./dist/index.d.ts",
5
+ "main": "./sl-table-sheet.cjs.js",
6
+ "module": "./sl-table-sheet.es.js",
7
+ "types": "./index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
- "import": "./src/index.ts",
11
- "require": "./dist/sl-table-sheet.cjs.js",
12
- "types": "./dist/index.d.ts"
13
- },
14
- "./style.css": "./dist/sl-table-sheet.css",
15
- "./dist/style.css": "./dist/sl-table-sheet.css"
10
+ "import": "./sl-table-sheet.es.js",
11
+ "require": "./sl-table-sheet.cjs.js",
12
+ "types": "./index.d.ts"
13
+ }
16
14
  },
17
- "files": [
18
- "dist"
15
+ "keywords": [
16
+ "spreadsheet",
17
+ "typescript",
18
+ "javascript"
19
19
  ],
20
- "scripts": {
21
- "dev": "vite",
22
- "build": "pnpm run build:lib && pnpm run build:umd",
23
- "build:lib": "vite build --mode lib",
24
- "build:umd": "vite build --mode umd",
25
- "preview": "vite preview",
26
- "type-check": "tsc --noEmit",
27
- "publish": "npm run build && cd dist && npm publish"
28
- },
29
- "devDependencies": {
30
- "typescript": "^5.3.0",
31
- "vite": "^5.0.0",
32
- "vite-plugin-css-injected-by-js": "^3.5.2",
33
- "vite-plugin-dts": "^3.7.0"
34
- },
35
- "dependencies": {
36
- "@sl-ui-pc/theme-chalk": "0.1.0-beta1",
37
- "xlsx": "^0.18.5"
38
- },
20
+ "author": "",
21
+ "license": "MIT",
39
22
  "peerDependencies": {
40
23
  "@visactor/vtable": "^1.24.0",
41
24
  "@visactor/vtable-editors": "^1.24.0",
42
- "@visactor/vtable-sheet": "^1.24.0"
25
+ "@visactor/vtable-sheet": "^1.24.0",
26
+ "@visactor/vtable-gantt": "^1.24.0"
43
27
  },
44
28
  "peerDependenciesMeta": {
45
29
  "@visactor/vtable": {
@@ -54,12 +38,5 @@
54
38
  "@visactor/vtable-gantt": {
55
39
  "optional": false
56
40
  }
57
- },
58
- "keywords": [
59
- "spreadsheet",
60
- "typescript",
61
- "javascript"
62
- ],
63
- "author": "",
64
- "license": "MIT"
65
- }
41
+ }
42
+ }
@@ -503,12 +503,13 @@
503
503
 
504
504
  .sl-excel-find-replace-btn-primary {
505
505
  background-color: var(--sl-color-primary);
506
- color: white;
506
+ color: var(--sl-color-white);
507
507
  }
508
508
 
509
509
  .sl-excel-find-replace-btn-primary:hover {
510
510
  border-color: var(--sl-color-primary-light-3);
511
511
  background-color: var(--sl-color-primary-light-3);
512
+ color:var(--sl-color-white);
512
513
  }
513
514
 
514
515
  .sl-excel-message-toast {
@@ -24964,12 +24964,13 @@ const s_ = `
24964
24964
 
24965
24965
  .sl-excel-find-replace-btn-primary {
24966
24966
  background-color: var(--sl-color-primary);
24967
- color: white;
24967
+ color: var(--sl-color-white);
24968
24968
  }
24969
24969
 
24970
24970
  .sl-excel-find-replace-btn-primary:hover {
24971
24971
  border-color: var(--sl-color-primary-light-3);
24972
24972
  background-color: var(--sl-color-primary-light-3);
24973
+ color:var(--sl-color-white);
24973
24974
  }
24974
24975
 
24975
24976
  .sl-excel-message-toast {
@@ -322,12 +322,13 @@
322
322
 
323
323
  .sl-excel-find-replace-btn-primary {
324
324
  background-color: var(--sl-color-primary);
325
- color: white;
325
+ color: var(--sl-color-white);
326
326
  }
327
327
 
328
328
  .sl-excel-find-replace-btn-primary:hover {
329
329
  border-color: var(--sl-color-primary-light-3);
330
330
  background-color: var(--sl-color-primary-light-3);
331
+ color:var(--sl-color-white);
331
332
  }
332
333
 
333
334
  .sl-excel-message-toast {
package/README.md DELETED
@@ -1,550 +0,0 @@
1
- # @sl-material/sl-table-sheet
2
-
3
- 基于 VTable 的高性能表格组件,支持数据展示、编辑、Excel 导入导出、查找替换等功能。兼容 Vue 2/3、原生 JavaScript 和 Web Component。
4
-
5
- ## 特性
6
-
7
- - **高性能表格渲染** - 基于 canvas,支持大数据量展示
8
- - **数据编辑** - 支持单元格编辑,内置日期、下拉列表等编辑器
9
- - **Excel 互操作** - 支持 Excel 文件导入、导出,保留单元格样式
10
- - **查找替换** - 内置查找/替换弹窗,支持批量替换
11
- - **工具栏** - 可配置的工具栏,支持冻结列、数据统计显示
12
- - **单元格标记** - 支持高亮标记特定单元格
13
- - **自动尺寸调整** - 支持自动监听容器尺寸变化,智能防抖优化
14
- - **多框架支持** - 支持 Vue 2/3、原生 JS、TypeScript
15
-
16
- ## 安装
17
-
18
- ```bash
19
- npm install @sl-material/sl-table-sheet
20
- # 或
21
- yarn add @sl-material/sl-table-sheet
22
- # 或
23
- pnpm add @sl-material/sl-table-sheet
24
- ```
25
-
26
- ## 快速开始
27
-
28
- ### 原生 JavaScript/TypeScript
29
-
30
- ```typescript
31
- import { SlTableSheet } from "@sl-material/sl-table-sheet";
32
-
33
- // 初始化表格
34
- const tableSheet = new SlTableSheet({
35
- container: "#table-container", // 或 document.getElementById('table-container')
36
- columns: [
37
- { field: "name", title: "姓名", width: 120 },
38
- { field: "age", title: "年龄", width: 80 },
39
- { field: "department", title: "部门", width: 150 },
40
- ],
41
- records: [
42
- { name: "张三", age: 28, department: "技术部" },
43
- { name: "李四", age: 32, department: "产品部" },
44
- { name: "王五", age: 25, department: "设计部" },
45
- ],
46
- showToolbar: true, // 显示工具栏
47
- });
48
-
49
- // 销毁实例
50
- tableSheet.destroy();
51
- ```
52
-
53
- ### Vue 3
54
-
55
- ```vue
56
- <template>
57
- <div ref="tableContainer" style="height: 600px;"></div>
58
- </template>
59
-
60
- <script setup lang="ts">
61
- import { ref, onMounted, onUnmounted } from "vue";
62
- import { SlTableSheet } from "@sl-material/sl-table-sheet";
63
-
64
- const tableContainer = ref<HTMLElement>();
65
- let tableSheet: SlTableSheet | null = null;
66
-
67
- onMounted(() => {
68
- tableSheet = new SlTableSheet({
69
- container: tableContainer.value!,
70
- columns: [
71
- { field: "name", title: "姓名", width: 120 },
72
- { field: "age", title: "年龄", width: 80 },
73
- ],
74
- records: [
75
- { name: "张三", age: 28 },
76
- { name: "李四", age: 32 },
77
- ],
78
- });
79
- });
80
-
81
- onUnmounted(() => {
82
- tableSheet?.destroy();
83
- });
84
- </script>
85
- ```
86
-
87
- ## API 文档
88
-
89
- ### SlTableSheet 配置
90
-
91
- #### 构造函数参数 `SlTableSheetConfig`
92
-
93
- | 参数 | 类型 | 默认值 | 说明 |
94
- | ---------------- | ------------------------------------ | ------- | -------------------------------- |
95
- | `container` | `HTMLElement \| string` | 必填 | 容器元素或 CSS 选择器 |
96
- | `columns` | `any[]` | `[]` | 列配置数组 |
97
- | `records` | `any[]` | `[]` | 数据记录数组 |
98
- | `showToolbar` | `boolean` | `true` | 是否显示工具栏 |
99
- | `showFormulaBar` | `boolean` | - | 是否显示公式栏 |
100
- | `showSheets` | `boolean` | `false` | 是否显示工作表标签(VTable原生) |
101
- | `showTabs` | `boolean` | `true` | 是否显示自定义工作表标签页 |
102
- | `autoResize` | `boolean` | `false` | 是否启用自动监听容器尺寸变化 |
103
- | `sheets` | `SheetConfig[]` | - | 多工作表配置 |
104
- | `editors` | `EditorConfig` | - | 编辑器配置 |
105
- | `toolbar` | `Partial<ToolbarConfig>` | - | 工具栏配置 |
106
- | `onCellChange` | `(args: any) => void` | - | 单元格变更回调 |
107
- | `onExcelImport` | `(data: ExcelParseResult) => void` | - | Excel 导入完成回调 |
108
- | `onExport` | `(format: 'csv' \| 'excel') => void` | - | 导出按钮点击回调 |
109
- | `onRefresh` | `() => void` | - | 刷新按钮点击回调 |
110
-
111
- ### 实例方法
112
-
113
- #### 数据操作
114
-
115
- | 方法 | 参数 | 返回值 | 说明 |
116
- | ------------------------ | ------------------ | ------ | ------------ |
117
- | `updateData(records)` | `any[]` | `void` | 更新表格数据 |
118
- | `updateColumns(columns)` | `any[]` | `void` | 更新列配置 |
119
- | `refresh()` | - | `void` | 刷新表格 |
120
- | `exportData(format)` | `'csv' \| 'excel'` | `any` | 导出数据 |
121
-
122
- #### Excel 操作
123
-
124
- | 方法 | 参数 | 返回值 | 说明 |
125
- | ----------------------------------- | ---------------------------------- | --------------------------- | ---------------------- |
126
- | `loadExcelFromUrl(url, options)` | `string, ExcelParseOptions` | `Promise<ExcelParseResult>` | 从 URL 加载 Excel 文件 |
127
- | `parseExcelFile(file, options)` | `File, ExcelParseOptions` | `Promise<ExcelParseResult>` | 解析 File 对象 |
128
- | `parseExcelBuffer(buffer, options)` | `ArrayBuffer, ExcelParseOptions` | `ExcelParseResult` | 解析 ArrayBuffer |
129
- | `exportToExcelStream(options)` | `{ filterEmptyColumns?: boolean }` | `ArrayBuffer` | 导出为 Excel 流 |
130
- | `downloadExcel(filename)` | `string` | `void` | 下载 Excel 文件 |
131
-
132
- #### 查找替换
133
-
134
- | 方法 | 参数 | 返回值 | 说明 |
135
- | ------------------------------------------------- | --------- | ------ | -------------------- |
136
- | `openFindReplace()` | - | `void` | 打开查找/替换弹窗 |
137
- | `setFindReplaceSelectedColumnsOnly(selectedOnly)` | `boolean` | `void` | 设置是否只搜索选中列 |
138
-
139
- #### 工具栏
140
-
141
- | 方法 | 参数 | 返回值 | 说明 |
142
- | -------------------------------- | ---------------- | ----------------- | ---------------- |
143
- | `updateTitleStats(count, total)` | `number, number` | `void` | 更新标题统计数据 |
144
- | `getToolbar()` | - | `Toolbar \| null` | 获取工具栏实例 |
145
-
146
- #### 尺寸调整
147
-
148
- | 方法 | 参数 | 返回值 | 说明 |
149
- | ---------- | ---- | ------ | -------------------- |
150
- | `resize()` | - | `void` | 手动触发表格尺寸调整 |
151
-
152
- #### 其他
153
-
154
- | 方法 | 参数 | 返回值 | 说明 |
155
- | ------------------------ | ---- | --------------------------- | ------------------------ |
156
- | `getTableSheet()` | - | `TableSheet \| null` | 获取底层 TableSheet 实例 |
157
- | `getTableInstance()` | - | `any` | 获取 VTable 实例 |
158
- | `getFindReplaceDialog()` | - | `FindReplaceDialog \| null` | 获取查找替换弹窗实例 |
159
- | `destroy()` | - | `void` | 销毁实例 |
160
-
161
- ### 类型定义
162
-
163
- #### Column 列配置
164
-
165
- ```typescript
166
- interface Column {
167
- field: string; // 字段名
168
- title: string; // 列标题
169
- width: number; // 列宽
170
- sort?: boolean; // 是否可排序
171
- filter?: boolean; // 是否可筛选
172
- style?: (args: any) => any; // 自定义单元格样式
173
- }
174
- ```
175
-
176
- #### SheetConfig 工作表配置
177
-
178
- ```typescript
179
- interface SheetConfig {
180
- sheetKey: string; // 工作表唯一标识
181
- sheetTitle: string; // 工作表标题
182
- columns: any[]; // 列配置
183
- data: any[]; // 数据
184
- dragOrder?: {
185
- dragHeaderMode?: "all" | "column" | "row";
186
- };
187
- }
188
- ```
189
-
190
- #### EditorConfig 编辑器配置
191
-
192
- ```typescript
193
- interface EditorConfig {
194
- dateEditor?: boolean | any; // 日期编辑器
195
- listEditor?: {
196
- // 下拉列表编辑器
197
- values: string[];
198
- };
199
- customEditors?: Record<string, any>; // 自定义编辑器
200
- }
201
- ```
202
-
203
- #### ToolbarConfig 工具栏配置
204
-
205
- ```typescript
206
- interface ToolbarConfig {
207
- title?: string; // 标题
208
- count?: number; // 当前数量
209
- total?: number; // 总数
210
- hint?: string; // 提示文字
211
- freezeCount?: number; // 冻结列数
212
- showErrorList?: boolean; // 是否显示错误列表
213
- buttons?: {
214
- search?: boolean; // 查找/替换按钮
215
- freeze?: boolean; // 冻结列按钮
216
- export?: boolean; // 导出按钮
217
- refresh?: boolean; // 刷新按钮
218
- list?: boolean; // 列表按钮
219
- };
220
- onSearchClick?: () => void;
221
- onFreezeChange?: (count: number) => void;
222
- onListChange?: (checked: boolean) => void;
223
- }
224
- ```
225
-
226
- #### ExcelParseOptions Excel 解析选项
227
-
228
- ```typescript
229
- interface ExcelParseOptions {
230
- sheetIndex?: number; // 工作表索引,默认 0
231
- headerRow?: number; // 表头行索引,默认 0
232
- headerRows?: number; // 多层表头行数
233
- mergeHeaders?: boolean; // 是否合并多层表头,默认 true
234
- extractStyles?: boolean; // 是否提取单元格样式,默认 true
235
- }
236
- ```
237
-
238
- #### ExcelParseResult Excel 解析结果
239
-
240
- ```typescript
241
- interface ExcelParseResult {
242
- columns: Array<{
243
- key: string;
244
- field: string;
245
- title: string;
246
- width: number;
247
- sort?: boolean;
248
- filter?: boolean;
249
- }>;
250
- records: any[][];
251
- cellStyles?: Map<string, CellStyle>; // 单元格样式映射
252
- }
253
- ```
254
-
255
- #### CellStyle 单元格样式
256
-
257
- ```typescript
258
- interface CellStyle {
259
- fontColor?: string; // 字体颜色 (hex)
260
- bgColor?: string; // 背景颜色 (hex)
261
- bold?: boolean; // 是否加粗
262
- italic?: boolean; // 是否斜体
263
- }
264
- ```
265
-
266
- ## 高级用法
267
-
268
- ### 单元格标记(高亮显示)
269
-
270
- 支持在数据中标记特定单元格,自动应用高亮样式:
271
-
272
- ```typescript
273
- const records = [
274
- {
275
- name: "张三",
276
- age: { value: 28, isMarked: true }, // 标记该单元格
277
- department: "技术部",
278
- },
279
- {
280
- name: "李四",
281
- age: 32,
282
- department: { value: "产品部", isMarked: true },
283
- },
284
- ];
285
-
286
- const tableSheet = new SlTableSheet({
287
- container: "#container",
288
- columns: [
289
- { field: "name", title: "姓名", width: 120 },
290
- { field: "age", title: "年龄", width: 80 },
291
- { field: "department", title: "部门", width: 150 },
292
- ],
293
- records,
294
- });
295
- ```
296
-
297
- ### Excel 导入导出
298
-
299
- ```typescript
300
- const tableSheet = new SlTableSheet({
301
- container: "#container",
302
- columns: [], // 初始为空,导入后自动填充
303
- records: [],
304
- onExcelImport: (result) => {
305
- console.log("导入成功:", result.columns, result.records);
306
- console.log("单元格样式:", result.cellStyles);
307
- },
308
- });
309
-
310
- // 从 URL 加载 Excel
311
- await tableSheet.loadExcelFromUrl("https://example.com/data.xlsx", {
312
- sheetIndex: 0,
313
- headerRow: 0,
314
- extractStyles: true, // 提取单元格样式
315
- });
316
-
317
- // 解析上传的文件
318
- const fileInput = document.getElementById("file-input");
319
- fileInput.addEventListener("change", async (e) => {
320
- const file = e.target.files[0];
321
- await tableSheet.parseExcelFile(file);
322
- });
323
-
324
- // 导出并下载 Excel
325
- tableSheet.downloadExcel("导出数据");
326
- ```
327
-
328
- ### 自定义工具栏
329
-
330
- ```typescript
331
- const tableSheet = new SlTableSheet({
332
- container: '#container',
333
- columns: [...],
334
- records: [...],
335
- showToolbar: true,
336
- toolbar: {
337
- title: '数据错误',
338
- count: 10,
339
- total: 100,
340
- hint: '请检查错误数据',
341
- buttons: {
342
- search: true, // 显示查找/替换
343
- freeze: true, // 显示冻结列
344
- export: false, // 隐藏导出
345
- refresh: true, // 显示刷新
346
- list: false, // 隐藏列表
347
- },
348
- onFreezeChange: (count) => {
349
- console.log('冻结列数:', count);
350
- },
351
- },
352
- onRefresh: () => {
353
- console.log('刷新 clicked');
354
- tableSheet.refresh();
355
- },
356
- });
357
-
358
- // 动态更新统计数据
359
- tableSheet.updateTitleStats(20, 200);
360
- ```
361
-
362
- ### 查找替换功能
363
-
364
- ```typescript
365
- const tableSheet = new SlTableSheet({
366
- container: '#container',
367
- columns: [...],
368
- records: [...],
369
- });
370
-
371
- // 打开查找替换弹窗
372
- tableSheet.openFindReplace();
373
-
374
- // 设置只搜索选中列
375
- tableSheet.setFindReplaceSelectedColumnsOnly(true);
376
-
377
- // 通过按钮点击打开查找替换
378
- toolbar: {
379
- onSearchClick: () => {
380
- tableSheet.openFindReplace();
381
- },
382
- }
383
- ```
384
-
385
- ### 自动监听容器尺寸变化
386
-
387
- ```typescript
388
- // 方式一:配置项启用(推荐)
389
- const tableSheet = new SlTableSheet({
390
- container: '#container',
391
- columns: [...],
392
- records: [...],
393
- autoResize: true, // 启用自动监听
394
- });
395
-
396
- // 方式二:手动启用
397
- const tableSheet = new SlTableSheet({
398
- container: '#container',
399
- columns: [...],
400
- records: [...],
401
- });
402
-
403
- // 手动启用自动监听
404
- const success = tableSheet.enableAutoResize();
405
- if (success) {
406
- console.log('自动监听已启用');
407
- } else {
408
- console.log('浏览器不支持,请使用手动模式');
409
- }
410
-
411
- // 手动触发 resize(适用于 autoResize: false 的情况)
412
- tableSheet.resize();
413
-
414
- // 禁用自动监听
415
- tableSheet.disableAutoResize();
416
- ```
417
-
418
- **兼容性说明**:
419
-
420
- - ✅ **现代浏览器**:Chrome 64+、Firefox 69+、Safari 13.1+、Edge 79+
421
- - ❌ **旧版浏览器**:IE 11、Chrome < 64、Firefox < 69
422
- - 🔄 **自动降级**:不支持时自动使用手动模式
423
-
424
- ### 事件监听
425
-
426
- ```typescript
427
- const tableSheet = new SlTableSheet({
428
- container: '#container',
429
- columns: [...],
430
- records: [...],
431
- onCellChange: (args) => {
432
- console.log('单元格变更:', args);
433
- },
434
- });
435
-
436
- // 监听 VTable 原生事件
437
- tableSheet.on('cellClick', (args) => {
438
- console.log('单元格点击:', args);
439
- });
440
-
441
- tableSheet.on('scroll', (args) => {
442
- console.log('滚动:', args);
443
- });
444
-
445
- // 取消监听
446
- const handleClick = (args) => console.log(args);
447
- tableSheet.on('cellClick', handleClick);
448
- tableSheet.off('cellClick', handleClick);
449
- ```
450
-
451
- ### 独立使用工具类
452
-
453
- ```typescript
454
- import {
455
- loadExcelFromUrl,
456
- parseExcelFile,
457
- parseExcelBuffer,
458
- exportToExcelStream,
459
- downloadExcel,
460
- } from "@sl-material/sl-table-sheet";
461
-
462
- // 独立解析 Excel
463
- const result = await loadExcelFromUrl("https://example.com/data.xlsx");
464
-
465
- // 独立导出 Excel
466
- const buffer = exportToExcelStream(columns, records);
467
- downloadExcel(buffer, "文件名");
468
- ```
469
-
470
- ## UMD 使用方式
471
-
472
- ```html
473
- <script src="https://unpkg.com/@sl-material/sl-table-sheet/dist/sl-table-sheet.umd.js"></script>
474
- <script>
475
- const { SlTableSheet } = window.SlTableSheet;
476
-
477
- const tableSheet = new SlTableSheet({
478
- container: "#container",
479
- columns: [{ field: "name", title: "姓名", width: 120 }],
480
- records: [{ name: "张三" }],
481
- });
482
- </script>
483
- ```
484
-
485
- ## 项目架构
486
-
487
- ```
488
- src/
489
- ├── core/ # 核心模块
490
- │ ├── SlTableSheet.ts # 主入口类,UI 布局与协调
491
- │ ├── TableSheet.ts # 表格核心逻辑
492
- │ ├── Dialog.ts # 查找/替换弹窗
493
- │ ├── Toolbar.ts # 工具栏组件
494
- │ ├── types.ts # 核心类型定义
495
- │ ├── comnon.ts # 通用工具函数
496
- │ │
497
- │ ├── excel/ # Excel 处理模块
498
- │ │ ├── ExcelParser.ts # Excel 解析协调器
499
- │ │ ├── ExcelExporter.ts # Excel 导出器
500
- │ │ ├── types.ts # Excel 相关类型
501
- │ │ ├── index.ts # 模块导出
502
- │ │ ├── utils/
503
- │ │ │ └── ColorConverter.ts # 颜色转换工具
504
- │ │ └── parsers/
505
- │ │ ├── HeaderDetector.ts # 智能表头检测
506
- │ │ ├── StyleExtractor.ts # 样式提取
507
- │ │ └── CommentExtractor.ts # 批注提取
508
- │ │
509
- │ ├── managers/ # 管理器模块
510
- │ │ ├── CustomComponentManager.ts # 自定义组件管理
511
- │ │ ├── CellMarkManager.ts # 标记单元格管理
512
- │ │ ├── EditorManager.ts # 编辑器注册
513
- │ │ └── EventManager.ts # 事件管理
514
- │ │
515
- │ └── processors/ # 数据处理器模块
516
- │ ├── DataProcessor.ts # 数据预处理
517
- │ └── StyleProcessor.ts # 样式处理
518
- │
519
- ├── assets/ # 静态资源
520
- │ └── var.css # CSS 变量
521
- │
522
- └── index.ts # 包入口
523
- ```
524
-
525
- ### 设计原则
526
-
527
- 1. **单一职责**: 每个模块只负责一个功能领域
528
- 2. **低耦合**: 模块间通过接口通信,便于独立测试和替换
529
- 3. **向后兼容**: `ExcelUtils.ts` 保留为兼容层,确保旧代码正常工作
530
- 4. **渐进式加载**: Excel 解析器按需使用,避免不必要的计算
531
-
532
- ## 依赖
533
-
534
- - `@visactor/vtable-sheet`: 核心表格引擎
535
- - `@visactor/vtable-editors`: 单元格编辑器
536
- - `xlsx`: Excel 文件处理
537
- - `@sl-ui-pc/theme-chalk`: 主题样式
538
-
539
- ## 更新日志
540
-
541
- ### v1.0.0-beta6
542
-
543
- - **新增功能**: 自动监听容器尺寸变化
544
- - 新增 `autoResize` 配置项,默认 `false`
545
- - 新增 `enableAutoResize()` / `disableAutoResize()` 方法
546
- - 新增 `resize()` 手动触发方法
547
- - 支持 ResizeObserver API,兼容性检查和自动降级
548
- - 性能优化:防抖机制、微小变化过滤、尺寸缓存
549
- - **使用方式**: 支持配置项和手动启用两种方式
550
- - **兼容性**: 现代浏览器支持,旧浏览器自动降级为手动模式
package/dist/package.json DELETED
@@ -1,42 +0,0 @@
1
- {
2
- "name": "@sl-material/sl-table-sheet",
3
- "version": "1.1.0-beta1",
4
- "description": "VTable 组件库 - 支持 npm 和 UMD",
5
- "main": "./sl-table-sheet.cjs.js",
6
- "module": "./sl-table-sheet.es.js",
7
- "types": "./index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./sl-table-sheet.es.js",
11
- "require": "./sl-table-sheet.cjs.js",
12
- "types": "./index.d.ts"
13
- }
14
- },
15
- "keywords": [
16
- "spreadsheet",
17
- "typescript",
18
- "javascript"
19
- ],
20
- "author": "",
21
- "license": "MIT",
22
- "peerDependencies": {
23
- "@visactor/vtable": "^1.24.0",
24
- "@visactor/vtable-editors": "^1.24.0",
25
- "@visactor/vtable-sheet": "^1.24.0",
26
- "@visactor/vtable-gantt": "^1.24.0"
27
- },
28
- "peerDependenciesMeta": {
29
- "@visactor/vtable": {
30
- "optional": false
31
- },
32
- "@visactor/vtable-editors": {
33
- "optional": false
34
- },
35
- "@visactor/vtable-sheet": {
36
- "optional": false
37
- },
38
- "@visactor/vtable-gantt": {
39
- "optional": false
40
- }
41
- }
42
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes