前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法

Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法

作者头像
Excel催化剂
发布2021-08-19 14:56:00
1.2K0
发布2021-08-19 14:56:00
举报
文章被收录于专栏:Excel催化剂

为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中

功能概述

修复ExcelCom加载项常见问题,如每次需重新勾选COM加载项或COM加载项被列入禁用清单中不用使用,同时也提供让WPS计用COM加载项的方法

使用场景

因用户在使用COM技术开发的加载项过程中,难免各种意外操作,致使加载项处理非活动状态或失效状态,虽然可以通过界面的方式去解决,但步骤偏多,对普通用户来说,较难以去理解及操作,将其封装成一个exe文件,让用户自行双击运行解决是个不错的解决方案,本篇代码也是为这个功能场景而开发的。

技术原理

其实COM加载项的活动与否、禁用与否,都会在注册表上写上相关信息,只需从注册表层面对用户电脑的注册表项进行修改,即可实现非Excel界面操作的方式实现自动化修复插件。

WPS调用COM加载项原理,也只是在注册表上新增几个条目,让WPS可以通过查找注册表,找到COM加载项所在位置并调用它。

详细代码

代码语言:javascript
复制
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 插件修复程序
{
    class Program
    {
        private static string addinsKeyWords = "Excel催化剂";//可以模糊查找注册表里含此关键字的条目
        static void Main(string[] args)
        {
            ExcelRepair();
            Console.WriteLine("修复完成,请按任意键退出!");
            Console.ReadKey();
        }

        private static void ExcelRepair()
        {
            //TODO:检查禁用项
            CheckDisalbledItem();
            //TODO:检查Addin注册表
            CheckRegister();
            //增加WPS可识别VSTO插件的方法,具体需要看真正安装后的注册表路径及项目名称是什么而定。
            LetWPSRunAddins();
        }

        private static void CheckDisalbledItem()
        {
            string keypath = @"Software\Microsoft\Office"; //\15.0\Excel\Resiliency\DisabledItems
            RegistryKey key = Registry.CurrentUser.OpenSubKey(keypath, true);
            FindAndDeleteDisabledItems(key, "DisabledItems", addinsKeyWords);
        }

        public static void CheckRegister()
        {
            RegistryKey key = Registry.CurrentUser;

            RegistryKey addins = key.OpenSubKey(@"Software\Microsoft\Office\Excel\Addins", true);

            foreach (var item in addins.GetSubKeyNames())
            {
                if (item.ToUpper().Contains(addinsKeyWords.ToUpper()))
                {
                    var addin = addins.OpenSubKey(item, true);
                    addin.SetValue("LoadBehavior", "3", RegistryValueKind.DWord);//将启动方式改为3,即Excel打开时立即运行插件
                }
            }


        }

        private static void LetWPSRunAddins()
        {
            RegistryKey key = Registry.CurrentUser;

            RegistryKey addins = key.OpenSubKey(@"Software\Microsoft\Office\Excel\Addins", true);

            var wps = key.CreateSubKey(@"Software\Kingsoft\Office\ET\AddinsWL");
            wps.SetValue("Excel催化剂工作室.Excel催化剂", "Excel催化剂工作室.Excel催化剂", RegistryValueKind.String);
            wps.SetValue("Excel催化剂", "Excel催化剂", RegistryValueKind.String);
            wps.SetValue("Excel催化剂工作室.Excel催化剂离线版", "Excel催化剂工作室.Excel催化剂离线版", RegistryValueKind.String);
        }

        /// <summary>
        /// 查找指定项指定内容
        /// </summary>
        /// <param name="key"></param>
        /// <param name="subkeyname">这里是禁用项的名称</param>
        /// <param name="deleteStr">自己插件的名称</param>
        private static void FindAndDeleteDisabledItems(RegistryKey key, string subkeyname, string deleteStr)
        {
            if (key.Name.Contains(subkeyname))
            {
                for (int i = 0; i < key.ValueCount; i++)
                {
                    try
                    {
                        foreach (var item in key.GetValueNames().Where(s => Encoding.Unicode.GetString((byte[])key.GetValue(s)).ToUpper().Contains(deleteStr.ToUpper())))
                        {
                            key.DeleteValue(item);
                        }

                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
                return;
            }
            if (key.SubKeyCount > 0)
            {
                foreach (var item in key.GetSubKeyNames())
                {
                    try
                    {
                        FindAndDeleteDisabledItems(key.OpenSubKey(item, true), subkeyname, deleteStr);
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
            }
        }
    }
}

开源地址为:https://github.com/minren118/ExcelUdfByExcelCuiHuaJi,不妨对您有帮助时帮忙在GtiHub上点个赞。

登录Github后点击红框给个星星

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能概述
  • 使用场景
  • 技术原理
  • 详细代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档