From 5bc1dbc3f59928b784886eed4cf347a0fbf0de1e Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Tue, 20 Jan 2026 08:38:19 +0800 Subject: [PATCH] add: enhance TARGET_XLSM_FILE configuration and improve file selection process in extract_vba.py --- extract_vba.py | 101 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 32 deletions(-) diff --git a/extract_vba.py b/extract_vba.py index a838b30..fb93707 100644 --- a/extract_vba.py +++ b/extract_vba.py @@ -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)")