add: enhance TARGET_XLSM_FILE configuration and improve file selection process in extract_vba.py

This commit is contained in:
Misaka_Company
2026-01-20 08:38:19 +08:00
parent 4b8ba2d144
commit 5bc1dbc3f5

View File

@@ -11,6 +11,13 @@ import re
from pathlib import Path
from typing import Dict, List, Tuple, Optional
# ==================== 配置区域 ====================
# 在此配置要处理的xlsm文件路径
# 支持相对路径(相对于脚本所在目录)或绝对路径
# 留空或设为None则使用交互模式自动查找Excel文件夹
TARGET_XLSM_FILE = r"C:\Users\Administrator\Desktop\新BOM\AutoBOM\YTHN-100.A0.532-BOM-1.2版 Claude.xlsm" # 例如: r"Excel\myfile.xlsm" 或 r"D:\path\to\file.xlsm"
# =================================================
# VBA项目相关常量
STANDARD_MODULE_DIR = "Modules"
CLASS_MODULE_DIR = "ClassModules"
@@ -22,16 +29,21 @@ METADATA_FILE = "vba_metadata.json"
class VBAExtractor:
"""VBA代码提取器"""
def __init__(self, xlsm_path: str, output_dir: str = None):
def __init__(self, xlsm_path: str, output_dir: str = None, use_same_dir: bool = True):
"""
初始化VBA提取器
Args:
xlsm_path: xlsm文件路径
output_dir: 输出目录默认为项目根目录下的VBA文件夹
output_dir: 输出目录当use_same_dir=False时有效
use_same_dir: 是否使用目标文件同目录下的VBA文件夹默认True
"""
self.xlsm_path = Path(xlsm_path)
if output_dir is None:
if use_same_dir:
# 使用目标文件同目录下的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"
@@ -339,43 +351,68 @@ def main():
print("=" * 60)
print()
# 查找xlsm文件
excel_dir = Path("Excel")
if not excel_dir.exists():
print("错误: 未找到Excel文件夹")
return
# 检查是否配置了目标文件
if TARGET_XLSM_FILE and TARGET_XLSM_FILE.strip():
# 使用配置的文件路径
script_dir = Path(__file__).parent
target_path = Path(TARGET_XLSM_FILE)
xlsm_files = list(excel_dir.glob("*.xlsm"))
if not xlsm_files:
print("错误: Excel文件夹中没有xlsm文件")
return
# 如果是相对路径,则相对于脚本所在目录
if not target_path.is_absolute():
target_path = script_dir / target_path
# 如果有多个文件,让用户选择
if len(xlsm_files) > 1:
print("发现多个xlsm文件:")
for i, f in enumerate(xlsm_files, 1):
print(f" {i}. {f.name}")
if not target_path.exists():
print(f"错误: 配置的文件不存在: {target_path}")
return
if not target_path.suffix.lower() == '.xlsm':
print(f"警告: 文件扩展名不是.xlsm: {target_path.name}")
xlsm_file = target_path
print(f"使用配置文件: {xlsm_file.name}")
print()
choice = input("请选择文件编号 (直接回车选择第1个): ").strip()
if not choice:
xlsm_file = xlsm_files[0]
else:
try:
idx = int(choice) - 1
xlsm_file = xlsm_files[idx]
except:
print("无效选择,使用第一个文件")
xlsm_file = xlsm_files[0]
else:
xlsm_file = xlsm_files[0]
# 交互模式查找xlsm文件
excel_dir = Path("Excel")
if not excel_dir.exists():
print("错误: 未找到Excel文件夹")
return
print()
print(f"选择文件: {xlsm_file.name}")
print()
xlsm_files = list(excel_dir.glob("*.xlsm"))
if not xlsm_files:
print("错误: Excel文件夹中没有xlsm文件")
return
# 创建提取器
# 如果有多个文件,让用户选择
if len(xlsm_files) > 1:
print("发现多个xlsm文件:")
for i, f in enumerate(xlsm_files, 1):
print(f" {i}. {f.name}")
print()
choice = input("请选择文件编号 (直接回车选择第1个): ").strip()
if not choice:
xlsm_file = xlsm_files[0]
else:
try:
idx = int(choice) - 1
xlsm_file = xlsm_files[idx]
except:
print("无效选择,使用第一个文件")
xlsm_file = xlsm_files[0]
else:
xlsm_file = xlsm_files[0]
print()
print(f"选择文件: {xlsm_file.name}")
print()
# 创建提取器使用默认参数输出到目标文件同目录下的VBA文件夹
extractor = VBAExtractor(str(xlsm_file))
# 显示输出目录信息
print(f"输出目录: {extractor.output_dir}")
print()
# 选择提取方法
print("请选择提取方法:")
print(" 1. COM接口 (推荐 - 需要安装Excel)")