使用C#开发Excel插件

之前个人VB写了一个的excel插件,今日想用c#写一个,百度了一下,泛滥的抄袭湮灭了有用的信息,依据国外网站能得到精华文章的惯例,这次也找到了一个,由于半桶水,花了几个小时百度修正了其中的错误

COM加载项(COM Add-ins )需要引用Extensibility.IDTextensibility2接口

如果使用COM加载项方式插件必须引用此接口。

C# dll文件必须注册才能使用,就不缀述了。

同时COM加载项还要在Microsoft Office里面注册才能被程序识别,这需要手动在 HKEY_CURRENT_USER.增加注册表键值

创建

  -打开Visual Studio 2017 (管理员权限)

-新建工程,Visual c#,类库(.NET Framework).

-更改项目名称为"ExcelCOMAddin".

-定位到本地某个文件夹,比如D:\respos

-重命名Class1.cs文件为MyConnect.cs

-增加项目引用(工程>添加引用)

 --程序集-拓展,找到“Extensibility”,“System.Windows.Forms",

--COM:Microsoft Office 16.0 Object Library",

删除默认的代码,增加如下内容到Myconnect.cs文件,需要注意,鼠标分别置于 IDTExtensibility2和IRibbonExtensibility上→点击黄色小灯泡→实现接口→VS会自动添加以下相关事件

namespace ExcelCOMAddin 
{ 
    [System.Runtime.InteropServices.Guid("5FA4884F-AA70-40C0-A4EC-F5390930B152")] 
    [System.Runtime.InteropServices.InterfaceType( 
        System.Runtime.InteropServices.ComInterfaceType.InterfaceIsDual)] 
    [System.Runtime.InteropServices.ComVisible(true)] 
    public interface IMyConnect : Extensibility.IDTExtensibility2,IRibbonExtensibility
    { 
        new void OnConnection( 
            object Application, 
            Extensibility.ext_ConnectMode ConnectMode, 
            object AddInInst, 
            ref Array custom); 
        new void OnDisconnection( 
            Extensibility.ext_DisconnectMode RemoveMode, 
            ref Array custom); 
        new void OnAddInsUpdate(ref Array custom); 
        new void OnStartupComplete(ref Array custom); 
        new void OnBeginShutdown(ref Array custom); 

        new string GetCustomUI(string RibbonID); 
    } 

在接口下面继续添加如下内容

    [System.Runtime.InteropServices.ProgId("ExcelCOMAddin.MyConnect")]
    [System.Runtime.InteropServices.ComDefaultInterface(typeof(IMyConnect))]
    [System.Runtime.InteropServices.Guid("DE3911A1-C82F-42F1-BEFB-F3802E1B6D34")]
    [System.Runtime.InteropServices.ClassInterface(
            System.Runtime.InteropServices.ClassInterfaceType.None)]
    [System.Runtime.InteropServices.ComVisible(true)]
    public class MyConnect : IMyConnect
    {
        Microsoft.Office.Interop.Excel.Application _ApplicationObject;
        Microsoft.Office.Core.COMAddIn _AddinInstance;

        public void OnConnection(
            object Application,
            Extensibility.ext_ConnectMode ConnectMode,
            object AddInInst,
            ref Array custom)
        {
            this._ApplicationObject = (Microsoft.Office.Interop.Excel.Application)Application;

            if (this._AddinInstance == null)
            {
                this._AddinInstance = (Microsoft.Office.Core.COMAddIn)AddInInst;
                this._AddinInstance.Object = this;
            }

            System.Windows.Forms.MessageBox.Show("onConnection");
        }
        public void OnDisconnection(
            Extensibility.ext_DisconnectMode RemoveMode,
            ref Array custom)
        {
            this._ApplicationObject = null;
            this._AddinInstance = null;
        }
        public void OnAddInsUpdate(ref Array custom)
        { }
        public void OnStartupComplete(ref Array custom)
        { }
        public void OnBeginShutdown(ref Array custom)
        { }

        public string GetCustomUI(string RibbonID)
        {
            return "";
        }
    }

选择生成-生成解决方案

选择项目属性,切换到生成标签,勾选 "Register for COM Interop" 

关闭属性窗口,重新生成解决方案

编译时,RegASM自动运行

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe\ RegAsm /codebase ExcelCOMAddin.dll

为COM加载项注册

打开注册表至:HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\

增加如下:

HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\ExcelCOMAddin.MyConnect 
(String)(Default) - (value not set) 
(String) Description - A Long Description 
(String) FriendlyName - ExcelCOMAddin 
(DWord) LoadBehavior - 2 

打开Excel,新建空白工作簿

打开文件-选项,切到加载项标签,在下拉框选择”COM加载项“,选中”ExcelCOMAddin“并保存。

加载成功会弹出一个对话框

增加Ribbon.xml

添加一个文件,选择xml文件

贴入如下内容,并将属性更改为“内嵌资源”

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="DemoTab" label="范例">
        <group id="loadFormsGroup" label="测试分组">
          <button id="btn1" label="按钮一" onAction="Button_One_Click" getImage="GetImage"/>
          <button id="btn2" label="按钮二" onAction="Button_Two_Click" getImage="GetImage"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

在Myconnect.cs增加如下内容

 public string GetCustomUI(string RibbonID) 
        { 
            return GetResourceText("ExcelComAddin.Ribbon.xml"); 
        } 

        private static string GetResourceText(string resourceName) 
        { 
            System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); 
            string[] resourceNames = asm.GetManifestResourceNames(); 

            for (int i = 0; i < resourceNames.Length; ++i) 
            { 
                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0) 
                { 
                    using (System.IO.StreamReader resourceReader = new System.IO.StreamReader(asm.GetManifestResourceStream(resourceNames[i]))) 
                    { 
                        if (resourceReader != null) 
                        { 
                            return resourceReader.ReadToEnd(); 
                        } 
                    } 
                } 
            } 
            return null; 
        } 

重新编译解决方案,打开Excel,你会发现增加了新的Riboon界面

本人已经打包,需要范例请从以下地址下载:

https://download.youkuaiyun.com/download/fleetstar/20024549

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值