之前个人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界面
本人已经打包,需要范例请从以下地址下载: