# Excel2MD **Repository Path**: simon1239/excel2-md ## Basic Information - **Project Name**: Excel2MD - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-20 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Excel2MD
![Python](https://img.shields.io/badge/python-3.9%2B-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Version](https://img.shields.io/badge/version-1.0.0-orange) **Excel 处理逻辑逆向解析工具** 自动将 Excel 文件中的公式、VBA 宏、依赖关系转化为结构化的 Markdown 技术文档 [快速开始](#快速开始) • [功能特性](#功能特性) • [使用文档](#使用文档) • [API 文档](#api-文档)
--- ## 介绍 Excel2MD 是一款专为后端开发、数据开发和业务系统迁移工程师设计的工具,能够精准提取 Excel 全链路数据处理逻辑,完成「Excel 公式 → 自然语言描述 → 目标代码片段」的自动转译,解决 Excel 逻辑黑盒问题。 ### 核心价值 - **逻辑透明化** — 将隐藏在 Excel 单元格中的公式逻辑转化为可读文档 - **业务理解** — 自动生成公式业务逻辑的自然语言描述 - **代码迁移** — 直接输出可执行的 Pandas DataFrame 代码 - **风险识别** — 自动检测硬编码、循环引用、VBA 高危操作 ### 适用场景 - 🔄 业务系统迁移时理解 Excel 计算逻辑 - 📊 数据开发人员对接 Excel 数据处理流程 - 🔍 代码审查时验证计算逻辑正确性 - 📚 构建 Excel 文件的自动化技术文档 --- ## 功能特性 ### 核心功能 | 功能 | 说明 | 状态 | |------|------|------| | 📄 **多格式支持** | 支持 `.xlsx` 和 `.xlsm` 文件 | ✅ v1.0 | | 🔗 **依赖分析** | 构建单元格依赖关系 DAG 图,检测循环引用 | ✅ v1.0 | | 📝 **公式解析** | 全量提取公式原文,识别绝对/相对/混合引用 | ✅ v1.0 | | 🤖 **VBA 解析** | 提取 `.xlsm` 中的 VBA 宏代码,解析过程/函数 | ✅ v1.0 | | 🌐 **自然语言转译** | 将公式转译为中文业务逻辑描述 | ✅ v1.0 | | 🐍 **代码生成** | 输出可执行的 Python Pandas DataFrame 代码 | ✅ v1.0 | | ⚠️ **风险检测** | 检测硬编码常量、外部引用、高危 VBA 操作 | ✅ v1.0 | | 📊 **Mermaid 图表** | 生成 Sheet 间数据流图和公式依赖图 | ✅ v1.0 | ### 支持的函数 Excel2MD 支持 **80+** 常用 Excel 函数的转译,包括但不限于: - **聚合函数**: SUM, AVERAGE, COUNT, MAX, MIN, SUMIF, SUMIFS, COUNTIF, COUNTIFS - **查找函数**: VLOOKUP, HLOOKUP, INDEX, MATCH, LOOKUP - **逻辑函数**: IF, IFS, AND, OR, NOT - **文本函数**: LEFT, RIGHT, MID, LEN, TRIM, UPPER, LOWER - **日期函数**: TODAY, NOW, YEAR, MONTH, DAY - **数学函数**: ROUND, INT, MOD, POWER, SQRT 对于不支持的函数,系统会优雅降级为「函数名 + 参数列表」格式。 ### 输出文档结构 生成的 Markdown 文档包含以下模块: 1. **文档概览** — 文件基础信息、Sheet 清单、统计数据 2. **Sheet 间数据流图** — Mermaid 可视化依赖关系 3. **工作表逻辑详情** — 每个 Sheet 的: - 基础信息(使用范围、行数、列数) - 核心公式表(原始公式、业务描述、Pandas 代码) - 公式业务逻辑详解(业务含义、引用单元格) 4. **VBA 模块详情**(如有) — 宏代码、逻辑说明、风险标记 5. **风险分级表** — 按高/中/低风险分类展示检测到的风险点 --- ## 软件架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 五层流水线架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 1. 接入层 (Access Layer) │ │ └─ ExcelFileLoader — 文件加载与校验 │ │ │ │ 2. 解析层 (Parse Layer) │ │ ├─ SheetParser — Sheet 信息提取 │ │ ├─ CellParser — 单元格解析 │ │ ├─ FormulaParser — 公式解析 │ │ └─ VbaParser — VBA 宏提取 │ │ │ │ 3. 分析层 (Analyze Layer) │ │ ├─ DependencyAnalyzer — DAG 依赖分析 │ │ ├─ FormulaNLTranslator — 自然语言转译 │ │ ├─ FormulaCodeGenerator — 代码生成 │ │ └─ RiskDetector — 风险检测 │ │ │ │ 4. 渲染层 (Render Layer) │ │ └─ MarkdownGenerator — 模板渲染 │ │ │ │ 5. 输出层 (Output Layer) │ │ └─ 文件写入 │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 技术栈 | 组件 | 技术 | 版本要求 | 用途 | |------|------|----------|------| | 核心语言 | Python | 3.9+ | 项目主语言 | | Excel 解析 | openpyxl | ≥3.1.0 | .xlsx/.xlsm 文件读取 | | 公式分析 | pycel | ≥1.0b30 | 公式编译与依赖提取 | | 依赖图 | networkx | ≥2.0,<2.7 | DAG 构建与拓扑排序 | | VBA 提取 | oletools | ≥0.60.1 | .xlsm 宏代码提取 | | 模板引擎 | Jinja2 | ≥3.1.0 | Markdown 模板渲染 | | 代码生成 | pandas | ≥2.0.0 | DataFrame 代码片段 | | CLI 框架 | click | ≥8.0.0 | 命令行工具 | | 测试框架 | pytest | ≥8.0.0 | 单元测试 | --- ## 快速开始 ### 环境要求 - Python 3.9 或更高版本 - pip 包管理器 ### 安装 #### 方式一:使用 pip 安装(推荐) ```bash pip install excel2md ``` #### 方式二:从源码安装 ```bash # 克隆仓库 git clone https://github.com/yourusername/Excel2MD.git cd Excel2MD # 安装依赖 pip install -r requirements.txt # 安装项目 pip install -e . ``` ### 验证安装 ```bash # 查看版本信息 excel2md --version # 预期输出 # Excel2MD v1.0.0 ``` --- ## 使用文档 ### CLI 命令行工具 #### 基础用法 ```bash # 最简用法:解析 Excel 文件并生成 Markdown 文档 excel2md --input data.xlsx --output logic_doc.md ``` #### 完整参数 ```bash excel2md \ --input data.xlsm \ --output report.md \ --enable-vba \ --enable-code-gen \ --enable-risk-detect \ --template custom_template.md.j2 \ --verbose ``` #### 参数说明 | 参数 | 短参数 | 类型 | 默认值 | 说明 | |------|---------|--------|------| | `--input` | `-i` | **必填** | 输入的 Excel 文件路径(支持 .xlsx/.xlsm) | | `--output` | `-o` | **必填** | 输出的 Markdown 文档路径 | | `--enable-vba` | - | `False` | 开启 VBA 宏解析(用于 .xlsm 文件) | | `--enable-code-gen` | - | `True` | 开启 Python 代码生成 | | `--enable-risk-detect` | - | `True` | 开启风险点检测 | | `--template` | `-t` | `None` | 自定义 Markdown 模板路径(Jinja2 格式) | | `--verbose` | `-v` | `False` | 开启详细日志输出 | | `--version` | - | - | 显示版本信息 | | `--help` | - | - | 显示帮助信息 | #### 使用示例 **示例 1:基础 Excel 解析** ```bash # 解析普通 Excel 文件 excel2md -i ./财务报表.xlsx -o ./财务逻辑.md ``` **示例 2:包含 VBA 宏的文件** ```bash # 解析包含宏的 Excel 文件 excel2md -i ./业务系统.xlsm -o ./系统文档.md --enable-vba ``` **示例 3:详细模式调试** ```bash # 开启详细日志查看处理过程 excel2md -i ./test.xlsx -o ./output.md -v ``` **示例 4:自定义模板** ```bash # 使用自定义模板生成文档 excel2md -i ./data.xlsx -o ./custom.md -t ./my_template.md.j2 ``` ### Python SDK #### 基础用法 ```python from excel2md import Excel2MDExecutor # 使用默认配置 executor = Excel2MDExecutor() result = executor.run( excel_path="./data.xlsx", output_path="./output.md" ) if result['success']: print("处理成功!") print(f"公式数量: {result['parse_summary']['formula_count']}") print(f"耗时: {result['execute_time']}秒") else: print(f"处理失败: {result['error_msg']}") ``` #### 自定义配置 ```python from excel2md import Excel2MDExecutor # 自定义配置 config = { 'enable_vba_parse': True, # 开启 VBA 解析 'enable_code_generation': True, # 开启代码生成 'enable_risk_detect': True, # 开启风险检测 'enable_mermaid_graph': True, # 开启 Mermaid 图表 'custom_template_path': './my_template.md.j2', # 自定义模板 'lazy_load': False, # 懒加载模式 } executor = Excel2MDExecutor(config=config) result = executor.run( excel_path="./data.xlsm", output_path="./output.md" ) ``` #### 获取执行日志 ```python from excel2md import Excel2MDExecutor executor = Excel2MDExecutor() result = executor.run(excel_path="./data.xlsx", output_path="./output.md") # 获取详细执行日志 logs = executor.get_execute_log() for log in logs: print(f"[LOG] {log}") ``` #### 处理结果 ```python { 'success': True, 'execute_time': 1.23, 'md_file_size': 4567, 'parse_summary': { 'sheet_count': 3, 'formula_count': 45, 'vba_module_count': 2, 'risk_count': 5, 'circular_deps': 0 }, 'warning_list': [], 'error_msg': None } ``` --- ## 输出示例 以下是一个生成的 Markdown 文档示例: ### 文档概览 | 指标 | 值 | | :--- | :--- | | 工作表总数 | 3 | | 公式总数 | 45 | | VBA 模块数 | 2 | | 检测到的风险点 | 5 | ### 公式业务逻辑 | 单元格地址 | 原始公式 | 业务逻辑描述 | Pandas 代码 | | :--- | :--- | :--- | :--- | | D2 | `=SUMIF(B:B,"已付款",C:C)` | 对 B 列中值为"已付款"的行,求和对应 C 列的数值 | ```python\n# 对 B 列中值为"已付款"的行,求和对应 C 列的数值\ndf.loc[df['B'] == '已付款', 'C'].sum()\n``` | | E5 | `=VLOOKUP(A2,Sheet2!A:B,2,FALSE)` | 在 Sheet2 的 A:B 范围中查找 A2,返回第 2 列的值(精确匹配) | ```python\n# 在 Sheet2 的 A:B 范围中查找 A2,返回第 2 列的值(精确匹配)\nlookup_value = df['A'].iloc[0]\nlookup_df = pd.read_excel('Sheet2.xlsx')\nresult = lookup_df.loc[lookup_df['A'] == lookup_value, 'B'].iloc[0]\n``` | ### 风险分级表 | 风险等级 | 描述 | 位置 | | :--- | :--- | :--- | | 🔴 高 | 检测到循环引用:A1 ↔ B1 | A1, B1 | | 🟡 中 | 硬编码常量:3.14 | C5 | | 🟢 低 | 空值无处理 | D10 | --- ## 开发与测试 ### 运行测试 ```bash # 运行所有测试 pytest # 运行特定测试文件 pytest tests/test_parsers.py # 运行测试并生成覆盖率报告 pytest --cov=excel2md --cov-report=html ``` ### 项目结构 ``` excel2md/ ├── excel2md/ │ ├── __init__.py │ ├── cli.py # CLI 入口 │ ├── executor.py # 主执行器 │ ├── core/ │ │ ├── base.py # 抽象基类 │ │ ├── loader.py # Excel 文件加载 │ │ ├── parsers/ # 解析器模块 │ │ ├── analyzers/ # 分析器模块 │ │ └── generator.py # Markdown 生成 │ └── templates/ # Jinja2 模板 ├── tests/ │ ├── test_loader.py │ ├── test_parsers.py │ ├── test_analyzers.py │ └── test_integration.py ├── requirements.txt ├── setup.py └── README.md ``` --- ## 常见问题 ### Q: 支持 .xls 格式吗? A: 不支持。Excel2MD 仅支持 `.xlsx` 和 `.xlsm` 格式,这是基于 openxml 的现代 Excel 格式,提供更好的公式解析能力。 ### Q: 如何处理加密的 Excel 文件? A: 当前版本不支持加密文件。如需处理,请先在 Excel 中取消密码保护,再使用 Excel2MD 解析。 ### Q: 生成的 Pandas 代码可以直接运行吗? A: 可以。生成的代码是基于 Pandas DataFrame 的完整代码片段,可以直接复制到 Python 环境中执行。但对于跨表引用的场景,需要确保相关的 DataFrame 已正确加载。 ### Q: VBA 宏函数会被转译吗? A: 当前版本不会转译 VBA 函数,只会提取并展示宏代码原文,标记其中的 Excel 公式调用和高危操作。VBA 函数转译计划在 v1.0+ 版本中支持。 ### Q: 如何处理非常大的 Excel 文件? A: 对于 10 万行级的大文件,建议在配置中启用 `lazy_load` 模式以减少内存占用。大文件性能优化计划在 v1.1 版本中实现。 ### Q: Windows 控制台显示乱码怎么办? A: 这是 Windows 控制台编码(GBK)与 UTF-8 不匹配的问题。输出文件本身是正确的 UTF-8 编码,仅在控制台显示时可能出现乱码,不影响实际结果。 --- ## 参与贡献 我们欢迎任何形式的贡献! ### 贡献流程 1. **Fork** 本仓库 2. 创建特性分支 (`git checkout -b feat/AmazingFeature`) 3. 提交更改 (`git commit -m 'feat: Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feat/AmazingFeature`) 5. 创建 Pull Request ### 提交规范 提交信息请遵循以下格式: ``` ():