C#开发Excel扩展插件

Excel的Python开发插件-- 完全替代陈旧的VBA Excel数据分析处理和呈现利器-PyXLL “python开发环境和EXCEL的桥梁” 在Excel中窥探Python的神奇世界 Python已经在大数据分析,数据挖掘,AI人工智能,计算机视觉等领域成为不可争议的行业标准。如何利用Python的强大编程环境来增强Excel电子表格的功能,如何在Excel表格中调用Python脚本语言,实现数据自动化处理,满足企业高效数据处理要求?您可以使用PyXLL!忘掉陈旧的VBA代码,开始采用更为现代的Python开发环境PyXLL! PyXLL... 阅读详情

如何用C#开发Excel扩展插件

文章源处:https://www.cnblogs.com/bobird/articles/2871265.html(权侵删)

文章出处    http://support.microsoft.com/?kbid=302901

毫无疑问,微软公司的Excel是一个非常成功的应用软件。它不仅本身功能强,而且还允许用户根据自己需要进行再开发以扩展其功能。传统上,我们可以用C/C++语言或者VBA对Excel进行扩展性开发。C/C++功能强大,但是开发工作比较复杂;VBA使用起来非常方便,但是功能有限。.NET的推出为我们提供了一种能够结合这两者长处的再开发手段。基于.NET的解决方案可以利用所有.NET开发平台提供的强大功能,例如多线程编程、分布式计算等。这都是VBA难以做到的,事实上即使使用C/C++,我们也很难实现这些功能。不仅如此,我们还可以充分利用Visual Studio的整体开发环境,例如版本控制之类的功能。这些功能对于团队开发非常重要,但是在VBA开发环境下则非常困难。

本文将以C#为例介绍对Excel进行再开发的方法和技巧。我们通常有三种方法来对Excel进行再开发:

一是扩展插件(AddIn)。这是开发Excel用户自定义函数的首选。

二是VSTO(Visual Studio Tool for Office)。这是开发Excel内嵌功能的首选(例如按钮、菜单等等)。

三是RTD(Real Time Data)。这是开发Excel实时数据应用程序的首选。

尽管它们针对的用途不同,但是开发的基本手段和过程是非常类似的。在技术细节上,这三种方法主要的不同是需要实施不同的接口。在本文中,我们将主要介绍利用C#开发Excel扩展插件的方法。读者可以依次类推在需要的时候开发其它两类的程序。

首先,创建一个C#库程序(library)并指定这个类程序库“控件可见”(Com Visible)。这通常是通过项目属性、Assembly属性来指定的,如下图所示。(注意不同版本的Visual Studio可能对话框的样子不同)。

 

 

为了方便起见,我们还可以让程序自动注册成控件。这可以通过项目属性、编译属性来指定,如下图所示。如果我们不指定这个属性的话,或者我们需要在其它计算机上使用这个程序的话,我们可以使用.NET平台自带的RegAsm.exe来手工进行注册。

 

其次,我们的项目需要添加以下两个引用:

Ø         (.NET)Extensibility

Ø         (COM)Microsoft Office Excel Object Library(选用最新版本)

然后,输入以下程序。程序中的注释已经对各部分的作用作了适当说明。注意,这个类程序并不是Excel用户自定义函数本身,而是包含了所有需要的基本架构函数。有了这个基类以后,我们就可以编写一个简单的子类仅仅包含我们需要的Excel用户自定义函数。

 

 

using System;

using System.Runtime.InteropServices;

using Extensibility;

using MyWin32 = Microsoft.Win32;

using MsExcel = Microsoft.Office.Interop.Excel;

 

namespace MyExcelAddIn

{

    ///

 

    /// Excel用户自定义函数的基类,包含了所有必需的基础架构类函数。它的子类则可以专注于用户自定义函数的编写。

    ///

 

    public class ExcelUDFBase : IDTExtensibility2

    {

        ///

 

        /// 这个函数将在我们的AddIn被注册时调用。

        ///

 

        ///

        [ComRegisterFunctionAttribute]

        public static void RegisterFunction(Type type_)

        {

            MyWin32.Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type_,"Programmable"));

 

            // 以下这两个函数调用不是必须的。但是省略它们的话,每次我们从EXCEL中引用或取掉这个AddIn时,EXCEL都会提示找不到mscoree.dll,问你

            // 是否要删掉这个AddIn。当然我们应该回答“不”。

            MyWin32.RegistryKey key = MyWin32.Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type_, "InprocServer32"), true);

 

            key.SetValue(""

, String.Format("{0}\\mscoree.dll", System.Environment.SystemDirectory)

, MyWin32.RegistryValueKind.String

);

        }

 

        ///

 

        /// 这个函数将在我们的AddIn被注销时调用。

        ///

 

        ///

        [ComUnregisterFunctionAttribute]

        public static void UnregisterFunction(Type type_)

        {

            MyWin32.Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type_,"Programmable"));

        }

 

        ///

 

        /// 工具函数。

        ///

 

        ///

        ///

        ///

        private static string GetSubKeyName(Type type_, String sub_key_ame_)

        {

            return String.Format("CLSID\\{{{0}}}\\{1}", type_.GUID.ToString().ToUpper(), sub_key_ame_);

        } 

 

        #region IDTExtensibility2 Members

 

        ///

 

        /// 这个变量将指向Excel应用程序。

        ///

 

        protected MsExcel.Application MyExcelAppInstance { get; private set; }

 

        ///

 

        /// 这个变量将指向我们的AddIn。

        ///

 

        protected object MyAddInInstance { get; private set; }

 

        ///

 

        /// 这个函数和以下四个函数都是为了实施IDTExtensibility2接口。实施IDTExtensibility2接口并不是必须的。但是如果我们不实施这个接口的

/// 话,我们将无法得到,从而无法编写Volatile函数。

        ///

 

        ///

        public void OnAddInsUpdate(ref Array custom)

        {

        }

 

        ///

 

        ///

 

        ///

        public void OnBeginShutdown(ref Array custom)

        {

        }

 

        ///

 

        ///

 

        ///

        ///

        ///

        ///

        public void OnConnection(object Application, ext_ConnectMode ConnectMode, objectAddInInst, ref Array custom)

        {

            MyExcelAppInstance = (MsExcel.Application)Application;

 

            MyAddInInstance = AddInInst;

        }

 

        ///

 

        ///

 

        ///

        ///

        public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)

        {

        }

 

        ///

 

        ///

 

        ///

        public void OnStartupComplete(ref Array custom)

        {

        }

        #endregion

    }

}

 

最后我们可以输入以下程序来创建了我们第一个用户自定义函数。(当然,另写一个类不是必须的,我们也可以把这个函数直接写在ExcelUDFBase类里。)

 

using System;

using System.Runtime.InteropServices;

using MsExcel = Microsoft.Office.Interop.Excel;

 

namespace MyExcelAddIn

{

   ///

 

/// 这个类包括我们真正需要的用户自定义函数。它的两个类属性是必须的。但是每个这样的类应该具有唯一的GUID值。GUID可以用Visual Studio自己生成。

/// 我们只要选择菜单中的工具(Tools),然后选择GUID选项就可以了。

    ///

   

 

[ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]

    [Guid("348E9F3A-96E4-42da-A5B9-FAD52E7744BB")]

     public class MyFunctions :  ExcelUDFBase

    {

        ///

 

        /// 这是个简单的样例函数。它的逻辑非常简单,无需过多解释。需要指出的是这个函数的返回值是object以及其内部的try . . . catch程序结构。

        /// 当程序出错的时候,这样的结构可以使我们的用户自定义函数返回合适的错误信息。

        ///

 

        ///

        ///

        ///

        public object MyDivid(double Value1, double Value2)

        {

            try

            {

                return Value1 / Value2;

            }

            catch (Exception err_)

            {

                return err_.ToString();

            }

        }

}

}

 

编译好之后,我们就可以启动Excel。先从菜单上选择“工具”(Tools)、“插件”(AddIn),然后点击“自动插件”(Automation)按钮。然后在跳出的对话框中选择MyExcelAddIn.MyFunctions。如果一切顺利的话,我们就可以使用我们刚才编写的MyDivid()函数了,如下图所示:

 

 

一个常见的可能问题是Excel和.NET版本不兼容。例如如果你使用的是Office 2002版而程序是用Visual Studio 2005版开发的。这时候,你就需要告诉Excel加载合适的.NET运行环境。这其实很简单,只要创建一个内容如下的文本文件,命名为excel.exe.config,并把它保存在excel.exe同一个目录下就可以了。

 

xml version=”1.0”?>
<configuration>
  <startup>
    <supportedRuntime version=”v2.0.50727”/>
  startup>
configuration>

 

至此,我们可以看到用C#开发Excel控件基本上和开发其它应用程序一样简单。我们唯一需要添加的就是在文章一开头ExcelUDFBase类里定义的几个函数,而这几个函数完全可以照抄。事实上,如果我们只要编写类似于MyDivid()这样的函数的话,我们甚至无需实施IDTExtensibility2接口,即只需要RegisterFunction()和UnregisterFunction()这两个函数就可以了。实施IDTExtensibility2接口的主要目的是为了获得指向Excel和AddIn的两个变量。有了这两个变量,我们就可以做一些比较高级开发工作。其中最简单但是最重要的大概是编写所谓的易变函数(Volatile)。熟悉Excel用户自定义函数的读者应该知道非易变函数只要输入没有变化,Excel就不会重新调用该函数。而易变函数则没有这个限制。用C#编写易变函数其实很容易,只要在相应的函数里首先调用MyExcelAppInstance.Volatile(Type.Missing)就可以了,如下所示:

 

        ///

 

        /// 这个函数是一个易变(Volatile)函数的例子。我们只要在相应函数的开头加上MyExcelAppInstance.Volatile(Type.Missing)就可以

        ///

 

        ///

        public double MyRand()

        {

            MyExcelAppInstance.Volatile(Type.Missing);

 

            return m_random.NextDouble();

        }

 

        ///

 

        ///

        ///

 

        private Random m_random = new Random();

用C/C++开发过Excel用户自定义函数的读者一定知道内存管理是个大问题,甚至传递一个字符串也需要考虑怎么释放内存。但是用C#则没有这个问题,甚至C#会为我们自动进行类型转换。请见下面这个例子:

 

        ///

 

        ///

        ///

 

        ///

        ///

        ///

        ///

        public object ShowInfo(String Name, DateTime When, MsExcel.Range Dummy)

        {

            try

            {

                return String.Format("{0} selected {2} cells at {1}.", Name, When, Dummy.Cells.Count);

            }

            catch (Exception err_)

            {

                return err_.ToString();

            }

        }

}

 

一个例子如下图所示:

 

 

另外一个常用技巧是函数参数的缺省值。我们知道C#一般不支持缺省参数,但是在这里我们却可以使用缺省参数。

        ///

 

        /// 使用缺省参数只要使用Optional这个属性就可以了。

        ///

 

        ///

        ///

        public object MyEcho([Optional, DefaultParameterValue("Buddy")]String Name)

        {

            try

            {

                return Name;

            }

            catch (Exception err_)

            {

                return err_.ToString();

            }

     }

 

一个例子如下图所示:

 

 

至此,我们已经介绍了利用C#开发Excel控件的基本方法和一些基本技巧。由此出发,我们就可以利用.NET平台提供的强大功能根据需要来开发更为复杂的用户自定义函数。

Office如何通过VSTO进行EXCEL插件开发 VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展Office应用程序(例如Word、Excel、PPT)。本文通过VSTO进行Excel插件开发总结,并进行记录。 阅读详情

相关推荐

精通C#Excel控件嵌入技巧与大全

Excel控件嵌入到C#应用程序中,可以充分利用Excel的强大功能来增强应用程序的实用性和用户体验。然而,这也带来了一些挑战,如性能优化、异常处理和安全性考虑等。通过掌握这些技巧和应用场景,开发者可以更加灵活地运用Excel控件来构建高效、稳定且易于使用的应用程序。在开发过程中,建议根据具体需求选择合适的嵌入方式(OLE自动化或第三方库),并充分考虑性能、安全性和用户体验等因素。同时,不断学习和探索新的技术和方法,也是成为一名精通C#开发的必经之路。

Yori_22的博客 756

C#开发Excel插件的强大开源工具

Excel-DNA是一个.Net开源项目,为开发者提供了一种便利的方法,可以将.Net代码与Excel集成,能够轻松的为Excel创建自定义函数、图表、表单等,一方面不仅可以利用.Net强大的库,另外一方面还可以与外部数据、程序等连接交互。利用该项目我们可以用来,开发一些数据分析与处理、数据自动化等一些场景。

成长的足迹 2399

Excel COM加载项实现

本文介绍了使用COM技术开发Excel加载项的关键步骤:1)实现IDTExtensibility2接口的5个核心方法;2)通过C#创建COM可见类并注册;3)Excel端配置和功能集成方式;4)提供调试技巧和部署注意事项,包括32/64位系统差异。强调需正确处理COM对象释放和版本兼容性问题,并推荐参阅MSDN官方文档获取最新API参考。(150字)

RulesChen的博客 707

使用C#开发Excel插件

之前个人VB写了一个的excel插件,今日想用c#写一个,百度了一下,泛滥的抄袭湮灭了有用的信息,依据国外网站能得到精华文章的惯例,这次也找到了一个,由于半桶水,花了几个小时百度修正了其中的错误 COM加载项(COMAdd-ins )需要引用Extensibility.IDTextensibility2接口 如果使用COM加载项方式插件必须引用此接口。 C#dll文件必须注册才能使用,就不缀述了。 同时COM加载项还要在MicrosoftOffice里面注册才能被程序识别,这需要手动在HKE...

fleetstar的博客 6757

C 导入EXCEL文件和导出EXCEL文件资源库

C# 导入EXCEL文件和导出EXCEL文件资源库 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含了一个C#项目,利用NPOI插件实现了WPF应用程序中EXCEL文件的导入功能。目前,导出EXCEL文件的功能尚未实现,但可以参考导入文件部分的代码进行相应的修改。 功能简介 EXCEL文件导入 支持手动选择文件所在位置。 使用NPOI插件进行文件读取。 EXCEL文...

gitblog_06729的博客 293

开发Excel Add-in的C#示例与实践

在数据密集型的行业中,Microsoft Excel 是处理表格数据的黄金标准。然而,标准的Excel功能有时无法满足特定业务流程的需求。这就是Excel Add-in(插件)出现的原因。这些插件能够扩展和自定义Excel的功能,使之更加贴合用户的特定工作需求。设计用户自定义功能是创建Add-in的关键。开发者可以根据目标用户的业务需求来设计功能,比如数据处理、报告生成、自动化任务等。

weixin_42300144的博客 1555

【亲测免费】 Excel-DNA 开源项目教程

Excel-DNA 是一个开源项目,旨在为 Excel 提供免费的 .NET 集成支持。通过 Excel-DNA,开发者可以使用 C#、F# 等 .NET 语言编写 Excel 插件,从而扩展 Excel 的功能。Excel-DNA 的核心库包含在 GitHub 仓库中,提供了丰富的 API 和工具,帮助开发者轻松地将 .NET 代码集成到 Excel 中。 ## 2. 项目快速启动 ### ...

gitblog_00423的博客 1419

Excel-DNA终极指南:免费.NET Excel插件开发全攻略

Excel-DNA是一个完全免费、简单易用的.NET工具,专门为Excel插件开发而生。无论你是Excel自动化新手,还是需要构建复杂业务系统的专业开发者,这个开源项目都能让你用熟悉的.NET语言(C#、VB.NET、F#)轻松创建功能强大的Excel插件。在本文中,我们将深入探索Excel-DNA的完整功能,从基础概念到高级技巧,带你全面掌握这个优秀的Excel扩展框架。 ## 🎯 为什么你

gitblog_00718的博客 715

Excel-DNA:让Excel与.NET完美融合的终极扩展指南

在当今数据驱动的商业环境中,Excel-DNA作为一款强大的.NET扩展工具,为Excel用户提供了前所未有的编程能力。这个免费的开源项目让开发者能够用C#、F#或VB.NET语言编写自定义函数、命令和用户界面组件,真正实现Excel与.NET生态系统的无缝集成。 ## 🚀 什么是Excel-DNA? Excel-DNA是一个轻量级的开源库,专门用于创建高性能的Excel加载项。它允许开发

gitblog_00675的博客 384

Excel-DNA 项目推荐

Excel-DNA 是一个开源项目,旨在为 Excel 提供免费的 .NET 集成支持。该项目的主要编程语言是 C#,同时也涉及 Assembly、C++、C、Batchfile 和 PowerShell 等其他语言。Excel-DNA 允许开发者使用 .NET 语言编写 Excel 插件,从而扩展 Excel 的功能。 ## 2. 项目的核心功能 Excel-DNA 的核心功能包括: - ...

gitblog_00633的博客 446

Excel-DNA如何让.NET开发者为Excel注入强大功能?

Excel-DNA是一个免费开源的.NET集成框架,专为Excel用户和开发者设计,让你能够使用C#、VB.NET等.NET语言为Excel创建自定义函数、菜单和工具栏。如果你正在寻找一种比VBA更强大、比传统COM插件更简单的方法来扩展Excel功能,Excel-DNA正是你需要的解决方案。 ## 🔥 核心价值:为什么选择Excel-DNA? ### 超越VBA的性能与功能 你是否曾因VB

gitblog_00161的博客 1025

Excel-DNA终极指南:3步让Excel变身.NET开发平台,零基础也能玩转数据魔法![特殊字符]

还在为Excel公式太简单而烦恼?还在为VBA代码维护困难而头疼?Excel-DNA就是你的救星!这个免费开源的.NET集成工具,能让你的Excel瞬间拥有专业开发能力,像变魔术一样处理复杂数据任务。无论你是数据分析师、财务人员还是开发者,今天就让Excel-DNA带你进入Excel的魔法世界! ## 🌟 Excel-DNA是什么?你的Excel超级变身器 想象一下,Excel原本只是个功能

gitblog_00829的博客 382

c#定制操作Excel--com组件(共3种方法)

1、新建项目并引用=》com组件=》excel libary 2、嵌入式互操作更改为false Application:Excel实例 WorkBook:相当于工作薄 WorkSheet:相当于工作表 Range:区域块 新建一个工作表: excelapplication = new Application(); book = excelapplication.Workbooks.Add(); Worksheet sheet1 = (Worksheet)book.Worksheets.Add

wanxiweilai的博客 2516

C#-Excel插件开发总结

Excel插件开发,目的是在工具栏中添加一个外部程序,点击这个外部程序,可以将当前的Sheet数据获取到并保存到另外一个sheet里面;主要注意两方面: 一、Excel插件外部程序建立向导,具体步骤是: 1. 在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目。 2. 在新建项目对话框中,展开项目类型下的其他项目,选

Lassewang的成长历程 4992

关于自己在使用C#开发excel插件的一些心得

关于自己在使用C#开发excel插件的一些心得 (第一次写博客,可能会有点粗糙,见谅见谅) 关于在VSTO里开发插件 我用的是VS2017版,对应的EXCEL是2013版。 因为一开始的我的项目任务就是在VSTO开发excel插件,所以被迫赶鸭子上架,...

a879946587的博客 3493

C#Excel插件

Excel插件开发,目的是在工具栏中添加一个外部程序,点击这个外部程序,可以将当前的Sheet数据获取到并保存到另外一个sheet里面;主要注意两方面: 一、Excel插件外部程序建立向导,具体步骤是: 1. 在 Microsoft Visual Studio .NET的文件菜单上,单击新建,然后单击项目。 2. 在新建项目对话框中,展开项目类型下的其他项目,选择

Lassewang的成长历程 7626

【软件技术基础】C#调用NPOI插件EXCEL进行处理

C#调用NPOI插件处理表格的模块

杰西笔记 1929

C# 添加Excel表单控件(Form Controls)

Excel中,添加的控件可以和单元格关联,我们可以操作控件来修改单元格的内容,在下面的文章中,将介绍在Excel中添加几种不同的表单控件的方法,包括: 添加文本框(Textbox) 单选按钮(Radio button) 复选框(Checkbox) 组合框(combo Box) 使用工具 Free Spire.XLS for .NET 8.3 (社区版) ...

akn76920的博客 970
molicaca
博客等级 码龄9年 1粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值