refactor: remove metadata generation and add configurable output directory

- Remove vba_metadata.json generation logic to simplify extraction process
- Add VBA_OUTPUT_DIR configuration to allow custom output path
- Update output directory priority: parameter > env var > source file directory
- Clean up unused imports and remove _save_metadata method

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-03 12:47:54 +08:00
parent 3569c76e53
commit 59f0ef2125

View File

@@ -6,10 +6,9 @@ VBA代码提取工具
import os import os
import sys import sys
import json
import re import re
from pathlib import Path from pathlib import Path
from typing import Dict, List, Tuple, Optional from typing import Tuple, Dict
# 加载 .env 配置文件 # 加载 .env 配置文件
try: try:
@@ -22,6 +21,8 @@ except ImportError:
# ==================== 配置区域 ==================== # ==================== 配置区域 ====================
# 从 .env 文件读取配置,如果未设置则使用 None交互模式 # 从 .env 文件读取配置,如果未设置则使用 None交互模式
TARGET_XLSM_FILE = os.getenv("TARGET_XLSM_FILE", "").strip() or None TARGET_XLSM_FILE = os.getenv("TARGET_XLSM_FILE", "").strip() or None
# VBA代码输出目录如果未设置则使用源文件同目录下的VBA文件夹
VBA_OUTPUT_DIR = os.getenv("VBA_OUTPUT_DIR", "").strip() or None
# ================================================= # =================================================
# VBA项目相关常量 # VBA项目相关常量
@@ -29,32 +30,32 @@ STANDARD_MODULE_DIR = "Modules"
CLASS_MODULE_DIR = "ClassModules" CLASS_MODULE_DIR = "ClassModules"
DOCUMENT_MODULE_DIR = "DocumentModules" DOCUMENT_MODULE_DIR = "DocumentModules"
FORMS_DIR = "Forms" FORMS_DIR = "Forms"
METADATA_FILE = "vba_metadata.json"
class VBAExtractor: class VBAExtractor:
"""VBA代码提取器""" """VBA代码提取器"""
def __init__(self, xlsm_path: str, output_dir: str = None, use_same_dir: bool = True): def __init__(self, xlsm_path: str, output_dir: str = None):
""" """
初始化VBA提取器 初始化VBA提取器
Args: Args:
xlsm_path: xlsm文件路径 xlsm_path: xlsm文件路径
output_dir: 输出目录(当use_same_dir=False时有效 output_dir: 输出目录(如果未指定则使用VBA_OUTPUT_DIR配置或源文件同目录
use_same_dir: 是否使用目标文件同目录下的VBA文件夹默认True
""" """
self.xlsm_path = Path(xlsm_path) self.xlsm_path = Path(xlsm_path)
if use_same_dir: # 确定输出目录的优先级:
# 1. 参数指定的 output_dir
# 2. 环境变量配置的 VBA_OUTPUT_DIR
# 3. 默认源文件同目录下的VBA文件夹
if output_dir is not None:
self.output_dir = Path(output_dir)
elif VBA_OUTPUT_DIR is not None:
self.output_dir = Path(VBA_OUTPUT_DIR)
else:
# 使用目标文件同目录下的VBA文件夹 # 使用目标文件同目录下的VBA文件夹
self.output_dir = self.xlsm_path.parent / "VBA" self.output_dir = self.xlsm_path.parent / "VBA"
elif output_dir is None:
# 使用脚本所在目录项目根目录下的VBA文件夹
script_dir = Path(__file__).parent
self.output_dir = script_dir / "VBA"
else:
self.output_dir = Path(output_dir)
# 创建输出目录结构 # 创建输出目录结构
self.modules_dir = self.output_dir / STANDARD_MODULE_DIR self.modules_dir = self.output_dir / STANDARD_MODULE_DIR
@@ -67,12 +68,6 @@ class VBAExtractor:
self.document_modules_dir.mkdir(parents=True, exist_ok=True) self.document_modules_dir.mkdir(parents=True, exist_ok=True)
self.forms_dir.mkdir(parents=True, exist_ok=True) self.forms_dir.mkdir(parents=True, exist_ok=True)
# 存储模块元数据
self.metadata = {
"source_file": str(self.xlsm_path),
"modules": {}
}
def parse_attributes(self, code: str) -> Tuple[Dict[str, str], str]: def parse_attributes(self, code: str) -> Tuple[Dict[str, str], str]:
""" """
解析VBA代码中的Attribute信息 解析VBA代码中的Attribute信息
@@ -145,14 +140,10 @@ class VBAExtractor:
vba_parser.close() vba_parser.close()
# 保存元数据文件
self._save_metadata()
print(f"\n提取完成!") print(f"\n提取完成!")
print(f"- 标准模块: {self.modules_dir}") print(f"- 标准模块: {self.modules_dir}")
print(f"- 类模块: {self.class_modules_dir}") print(f"- 类模块: {self.class_modules_dir}")
print(f"- 文档模块: {self.document_modules_dir}") print(f"- 文档模块: {self.document_modules_dir}")
print(f"- 元数据: {self.output_dir / METADATA_FILE}")
return True return True
else: else:
print("未在文件中发现VBA代码") print("未在文件中发现VBA代码")
@@ -235,14 +226,10 @@ class VBAExtractor:
workbook.Close(False) workbook.Close(False)
excel.Quit() excel.Quit()
# 保存元数据文件
self._save_metadata()
print(f"\n提取完成!") print(f"\n提取完成!")
print(f"- 标准模块: {self.modules_dir}") print(f"- 标准模块: {self.modules_dir}")
print(f"- 类模块: {self.class_modules_dir}") print(f"- 类模块: {self.class_modules_dir}")
print(f"- 文档模块: {self.document_modules_dir}") print(f"- 文档模块: {self.document_modules_dir}")
print(f"- 元数据: {self.output_dir / METADATA_FILE}")
return True return True
except Exception as e: except Exception as e:
@@ -338,22 +325,8 @@ class VBAExtractor:
with open(file_path, 'w', encoding='utf-8') as f: with open(file_path, 'w', encoding='utf-8') as f:
f.write(clean_code) f.write(clean_code)
# 保存元数据
self.metadata["modules"][clean_name] = {
"name": module_name,
"type": module_type,
"attributes": attributes,
"file": str(file_path.relative_to(self.output_dir))
}
print(f" [OK] 已保存: {clean_name} ({module_type})") print(f" [OK] 已保存: {clean_name} ({module_type})")
def _save_metadata(self):
"""保存元数据到JSON文件"""
metadata_path = self.output_dir / METADATA_FILE
with open(metadata_path, 'w', encoding='utf-8') as f:
json.dump(self.metadata, f, indent=2, ensure_ascii=False)
def main(): def main():
"""主函数""" """主函数"""
@@ -417,7 +390,8 @@ def main():
print(f"选择文件: {xlsm_file.name}") print(f"选择文件: {xlsm_file.name}")
print() print()
# 创建提取器使用默认参数输出到目标文件同目录下的VBA文件夹 # 创建提取器
# 输出目录优先级: 1. .env中的VBA_OUTPUT_DIR配置 2. 源文件同目录下的VBA文件夹
extractor = VBAExtractor(str(xlsm_file)) extractor = VBAExtractor(str(xlsm_file))
# 显示输出目录信息 # 显示输出目录信息