C# Excel禁用项重新启用

在做Excel插件的时候,常常碰到一个问题就是插件异常(可能是自己插件的Bug或者是用户的一些强制操作),然后被Excel禁用。你可以查看Excel ->选项 -> 加载项 -> 管理 -> 禁用项目->转到 看看对话框中是否有自己的插件。解决这个问题也简单,删除掉注册表项就可以了
以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;
                    }
                }
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值