C# Excel禁用项重新启用
2016-01-28 09:35
429 查看
在做Excel插件的时候,常常碰到一个问题就是插件异常(可能是自己插件的Bug或者是用户的一些强制操作),然后被Excel禁用。你可以查看Excel ->选项 -> 加载项 -> 管理 -> 禁用项目->转到 看看对话框中是否有自己的插件。解决这个问题也简单,删除掉注册表项就可以了
以office2013为例,禁用项的注册表路径是
HKEY_CURRENT_USER\Software\Microsoft\15.0\Excel\Resiliency\DisabledItems,要注意的是禁用项中的数据都是16进制的,所以处理的时候要转换为我们能看懂的String类型。我当时就思考禁用项在注册表中,但是搜索了半天都没搜到想要的结果,原因就是禁用项里的数据类型变成byte[]了。这是瞎耽误功夫。最后还是翻Office注册表项的时候找到了(网上没搜到,就一个一个翻着看)。
解释一下原理:这段代码包含两个功能,一个是去除禁用项(因为Office有很多版本,为了使软件兼容更多Office版本,所以这里查询所有版本的禁用项并检查是否存在自己的插件),一个是检查插件的连接状态并重新修改其为启动连接时加载。
以office2013为例,禁用项的注册表路径是
HKEY_CURRENT_USER\Software\Microsoft\15.0\Excel\Resiliency\DisabledItems,要注意的是禁用项中的数据都是16进制的,所以处理的时候要转换为我们能看懂的String类型。我当时就思考禁用项在注册表中,但是搜索了半天都没搜到想要的结果,原因就是禁用项里的数据类型变成byte[]了。这是瞎耽误功夫。最后还是翻Office注册表项的时候找到了(网上没搜到,就一个一个翻着看)。
解释一下原理:这段代码包含两个功能,一个是去除禁用项(因为Office有很多版本,为了使软件兼容更多Office版本,所以这里查询所有版本的禁用项并检查是否存在自己的插件),一个是检查插件的连接状态并重新修改其为启动连接时加载。
public void ExcelRepair() { //TODO:检查禁用项 CheckDisalbledItem(); //TODO:检查Addin注册表 CheckRegister(); } private void CheckDisalbledItem() { string keypath = @"Software\Microsoft\Office"; //\15.0\Excel\Resiliency\DisabledItems RegistryKey key = Registry.CurrentUser.OpenSubKey(keypath,true); FindSubItem(key, "DisabledItems", "这里写自己插件名称"); } public void CheckRegister() { RegistryKey key = Registry.CurrentUser; RegistryKey software = key.CreateSubKey(@"Software\Microsoft\Office\Excel\Addins\自己插件名称"); software.SetValue("LoadBehavior", "3", RegistryValueKind.DWord); } /// <summary> /// 查找指定项指定内容 /// </summary> /// <param name="key"></param> /// <param name="subkeyname">这里是禁用项的名称</param> /// <param name="deleteStr">自己插件的名称</param> private void FindSubItem(RegistryKey key, string subkeyname,string deleteStr) { if (key.Name.Contains(subkeyname)) { for (int i = 0; i < key.ValueCount; i++) { try { var result = key.GetValueNames().ToList().Find(v => System.Text.Encoding.ASCII.GetString((byte[])key.GetValue(v)).Replace("\0", "").ToUpper().Contains(deleteStr.ToUpper())); if (result.Count() > 0) { key.DeleteValue(result); } } catch (Exception ex) { continue; } } return; } if (key.SubKeyCount > 0) { foreach (var item in key.GetSubKeyNames()) { try { FindSubItem(key.OpenSubKey(item,true), subkeyname,deleteStr); } catch(Exception ex) { continue; } } } }
相关文章推荐
- 使用Python生成Excel格式的图片
- Excel 曝出 Power Query 安全漏洞,1.2 亿用户易受远程 DDE 攻击
- VBA将excel数据表生成JSON文件
- excel vba 限制工作表的滚动区域代码
- excel vba 高亮显示当前行代码
- 用注册表文件实现解开被锁定的.reg与inf文件
- 注册表导出管理员密码文件
- 修改注册表实现在桌面上显示Windows版本
- 用注册表清除3389登陆记录的方法
- 常见的注册表修改大全第1/3页
- vbscript 注册表脚本书写
- vbscript Registry 注册表操作实现代码(读写删除)
- vbs 注册表操作代码(添加删除)
- 杀毒除根 巧用注册表防止病毒重新生成
- vbs删除注册表项的代码
- 批处理操作注册表完全攻略(读取注册表/写入注册表等)
- 写给电脑初学者的一些建议(注册表篇)
- CMD下读取/修改/删除注册表项的方法
- SQL 导入导出Excel数据的语句
- C#实现读取注册表监控当前操作系统已安装软件变化的方法