# Excel 多 Sheet 导入设计 ## 1. 背景 当前 `ExcelConverter.convert()` 仅读取 Excel 文件的第一个 Sheet(`workbook.SheetNames[0]`),后续 Sheet 被忽略。用户需要导入包含多个 Sheet 的 Excel 文件,将全部规则合并输出。 ## 2. 目标 支持多 Sheet Excel 导入,所有 Sheet 合并为一份 YAML 输出。不改变 `RuleConverter` 接口签名。 ## 3. 设计 ### 3.1 数据流 ``` 用户选择 .xlsx/.xls 文件(多 Sheet) ↓ ExcelConverter.convert() ├── XLSX.readFile → 获取 workbook ├── 遍历 workbook.SheetNames │ ├── 每个 sheet → sheet_to_json → buildMarkdownTable │ └── 添加 "## SheetName" 标题分隔 ├── 合并为一张大 Markdown 文本 ├── 调用 convertContentWithAI(combined, context) └── AI 返回 YAML(合并所有规则)→ 写入 yamlPath ``` ### 3.2 变更范围 只改一个文件:`src/rules/converters/excel-converter.ts` | 变更 | 说明 | |------|------| | 删除 `const sheetName = workbook.SheetNames[0]` | 不再只取第一个 Sheet | | 新增 `buildSheetsMarkdown(workbook)` | 遍历所有 Sheet,逐个转 Markdown 表格并拼接 | | 修改 `convert()` 内部 | 调用 `buildSheetsMarkdown` 替代单 Sheet 逻辑 | | 保留 `buildMarkdownTable(rows)` | 复用现有单 Sheet 转表格函数 | | 保留错误处理 | try/catch、空 Sheet 校验 | ### 3.3 合并格式示例 ``` ## Sheet1 - 命名规范 | id | severity | description | message | |----|----------|-------------|---------| | naming-1 | error | 类名使用 PascalCase | 请修改为 PascalCase | ## Sheet2 - 安全规范 | id | severity | description | message | |----|----------|-------------|---------| | security-1 | error | 禁止硬编码密码 | 请将密码移入配置文件 | ``` ### 3.4 边界处理 - **空 Sheet**:跳过(不报错),继续处理其他 Sheet - **全部 Sheet 为空**:报错提示"Excel 工作表中没有数据" - **不同 Sheet 列结构不同**:各自独立转 Markdown 表格,AI 自主理解 - **单 Sheet 文件**:行为不变,兼容现有功能 ### 3.5 不涉及变更 - `setupView.ts`:ExcelConverter 已注册,无需改动 - `import-service.ts`:`convertContentWithAI` 已存在,无需改动 - `converter.ts`:`RuleConverter` 接口不变 - 其他 converter:不受影响