如何在C#中获取Excel工作表的Codename(代号)?
在C#中获取Excel工作表的Codename
问题描述
我正在使用一个Excel模板,其中工作表名称可能会更改,但Codename(代号)保持不变。请问是否可以在C#中获取Excel工作表的Codename?
我尝试使用shCodeName = SH_parent.CodeName;但无法正常工作,不过shName = SH_parent.Name;可以正常运行。
相关代码定义
- SH_parent的定义:
Excel.Worksheet SH_parent;
- 加载SH_parent的代码:
foreach (Excel.Name N in WB.Names) { if (!N.Name.Contains("!")) { //GLOBAL string SH_Name = N.RefersTo.ToString().Split('!')[0].Replace("=", "").Replace("'", ""); SH_parent= WB.Worksheets[SH_Name]; } else { //SHEET SH_parent = N.Parent; } }
解决方案
直接通过Excel.Worksheet对象的CodeName属性无法获取,是因为Office互操作库的Worksheet接口默认未暴露该属性。要获取Codename,可通过以下两种可行方法实现:
方法1:反射(后期绑定)
通过反射机制访问工作表对象的CodeName属性,示例代码:
using System.Reflection; // 确保SH_parent已正确赋值 string codeName = SH_parent.GetType().InvokeMember("CodeName", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public, null, SH_parent, null) as string;
方法2:扩展Worksheet接口
如果项目中需要频繁使用该功能,可以封装扩展方法简化调用:
public static class WorksheetExtensions { public static string GetCodeName(this Excel.Worksheet worksheet) { return worksheet.GetType().InvokeMember("CodeName", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public, null, worksheet, null) as string; } } // 调用方式 string shCodeName = SH_parent.GetCodeName();
备选方案:通过VBProject获取
Excel工作表的Codename存储在工作簿的VB项目中,也可通过访问Workbook.VBProject获取,但需注意两点:
- 开启Excel的宏权限(否则会抛出权限异常)
- 引用
Microsoft.Vbe.Interop程序集
示例代码:
using Microsoft.Vbe.Interop; foreach (VBComponent component in WB.VBProject.VBComponents) { if (component.Type == vbext_ComponentType.vbext_ct_Sheet) { if (component.Properties("Name").Value.ToString() == SH_parent.Name) { string codeName = component.Name; break; } } }
内容的提问来源于stack exchange,提问作者Dumitru Daniel
相关产品推荐
相关产品推荐

