在C#开发的VTSO应用中如何获取当前Excel文件的文件名?
VSTO 实现获取当前Excel文件名的解决方案
首先你提到的VTSO应为笔误,实际是VSTO(Visual Studio Tools for Office),以下分不同场景提供可直接复用的实现逻辑:
场景1:获取当前激活状态的工作簿文件名
这是最常用的场景,可直接匹配用户当前正在编辑的文档:
- 核心代码示例:
using Excel = Microsoft.Office.Interop.Excel; // 代码需放在VSTO插件上下文内执行,比如ThisAddIn类内部 private string GetActiveWorkbookFileName() { Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; if (activeWorkbook == null) { // 无打开的工作簿时返回空值,可根据业务需求调整返回逻辑 return string.Empty; } // 仅获取带后缀的文件名 string fileName = activeWorkbook.Name; // 若需要文件完整绝对路径,替换为以下代码 // string fullPath = activeWorkbook.FullName; return fileName; }
- 注意事项:
- 若当前打开的是未保存的新建工作簿,
FullName属性返回值和Name一致,仅显示默认名称(如「工作簿1」) - 工作簿处于保护状态或被其他进程锁定时,访问属性可能抛出异常,建议添加
try-catch包裹逻辑 - 若你开发的是文档级VSTO项目,无需走Globals对象,直接在项目上下文调用
ThisWorkbook.Name即可获取当前关联文档的文件名
- 若当前打开的是未保存的新建工作簿,
场景2:遍历所有已打开的工作簿批量匹配模板
如果需要检测所有已打开的文档来匹配模板,可遍历Application.Workbooks集合:
private List<string> GetAllOpenedWorkbookNames() { List<string> fileNames = new List<string>(); foreach (Excel.Workbook workbook in Globals.ThisAddIn.Application.Workbooks) { fileNames.Add(workbook.Name); // 此处可插入你的模板匹配逻辑,例如比对文件名特征、文档属性等 } return fileNames; }
模板匹配优化建议
单纯依赖文件名匹配模板的容错率较低,建议预先在模板文件中写入自定义文档属性作为唯一标识,通过读取属性匹配模板的准确率更高:
// 读取工作簿自定义属性示例 object customProperties = activeWorkbook.CustomDocumentProperties; Type propType = customProperties.GetType(); // 读取你预先写入模板的唯一标识属性,避免文件名修改后匹配失效
内容的提问来源于stack exchange,提问作者Julius Alexander
相关产品推荐
相关产品推荐

