在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
编程用户定义的功能 构建提供用户定义函数的管理型自动化加载项 首先,启动Visual Studio并创建一个新的C#类库项目。将项目命名为AutomationAddin。在您在新项目中为您创建的Class1.cs文件中,输入如清单3-1所示的代码。该代码定义了一个名为MyFunctions的类,它实现了一个名为MultiplyNTimes的函数。我们将使用此函数作为自定义公式。我们的类还实现了RegisterFunction和UnregisterFunction,它们分别归因于ComRegisterFunction属性和ComUnregisterFunction属性。当COM程序集注册为COM互操作时,RegisterFunction将被调用。当汇编未注册COM互操作时,UnregisterFunction将被调用。这些功能在注册表中放置了一个必要的密钥,允许Excel知道该类可以用作自动化加载项。 清单3-1 一个C#类被称为MyFunction,它暴露了一个用户定义的函数乘法 using System; using System.Runtime.InteropServices; using Microsoft.Win32; namespace AutomationAddin { [ClassInterface(ClassInterfaceType.AutoDual)] public class MyFunctions { public MyFunctions() { } public double MultiplyNTimes(double number1, double number2, double timesToMultiply) { double result = number1; for (double i = 0; i < timesToMultiply; i++) { result = result * number2; } return result; } [ComRegisterFunctionAttribute] public static void RegisterFunction(Type type) { Registry.ClassesRoot.CreateSubKey( GetSubKeyName(type)); } [ComUnregisterFunctionAttribute] public static void UnregisterFunction(Type type) { Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type),false); } private static string GetSubKeyName(Type type) { System.Text.StringBuilder s = new System.Text.StringBuilder(); s.Append(@"CLSID\{"); s.Append(type.GUID.ToString().ToUpper()); s.Append(@"}\Programmable"); return s.ToString(); } } } 使用这段代码编写,您需要修改项目,以便在构建COM互操作时自动注册该类。 首先,通过双击“解决方案资源管理器”中项目节点下的“属性”节点来显示项目的属性。 在出现的属性设计器中,单击“构建”选项卡,然后选中“注册COM Interop”复选框,如图3-7所示。 然后从Build菜单中选择Build Solution来构建类库项目。 您的操作将导致您的类库项目正在构建以及在注册表中作为自动化加载项注册。 Excel现在可以看到你的C#类并使用它。 图3-7 设置构建选项以注册COM互操作 在Excel中使用管理的自动化加载项
单击此对话框中的确定,您已将AutomationAddin.MyFunctions类添加到已安装的自动化加载项列表中,如图3-9所示。
现在,尝试在Excel公式中使用函数MultiplyNTimes。 首先创建一个简单的电子表格,其中包含一个数字,第二个数字乘以第一个数字,第三个数字用于将第一个数字乘以第二个数字的次数。 电子表格如图3-10所示。
单击数字下方工作簿中的空单元格,然后单击公式栏中的插入函数按钮(带有“fx”标签的按钮)。 从可用公式的对话框中,下拉“或选择类别”下拉框,然后选择AutomationAddin.MyFunction。 然后单击“Multiplyntimes”功能,如图3-11所示。
单击“确定”按钮后,Excel弹出对话框,帮助从电子表格中的单元格中选择功能参数,如图3-12所示。
从相应的单元格中选择功能参数后,单击“确定”创建最终的电子表格,如图3-13所示,单元格C5中的自定义公式。
一些其他用户定义的函数 清单3-2 可以添加到MyFunctions类的其他用户定义的函数 public string GetStars(double number) { System.Text.StringBuilder s = new System.Text.StringBuilder(); s.Append('*', number); return s.ToString(); } public double AddNumbers(double number1, [Optional] object number2, [Optional] object number3) { double result = number1; if (number2 != System.Type.Missing) { Excel.Range r2 = number2 as Excel.Range; double d2 = Convert.ToDouble(r2.Value2); result += d2; } if (number3 != System.Type.Missing) { Excel.Range r3 = number3 as Excel.Range; double d3 = Convert.ToDouble(r3.Value2); result += d3; } return result; } public double CalculateArea(object range) { Excel.Range r = range as Excel.Range; return Convert.ToDouble(r.Width) + Convert.ToDouble(r.Height); } public double NumberOfCells(object range) { Excel.Range r = range as Excel.Range; return r.Cells.Count; } public string ToUpperCase(string input) { return input.ToUpper(); } 在管理型自动化加载项中调试用户定义的函数
部署管理型自动化加载项 右键单击解决方案资源管理器中添加的安装项目,然后从添加菜单中选择项目输出。 从“添加项目输出组”对话框中,选择“AutomationAddin”项目,选择“主要输出”,如图3-15所示。
因为我们告诉项目注册我们用于COM互操作的托管对象,所以安装项目应该已经被正确设置,以便在安装时注册COM互操作的托管对象。 要验证此,请单击安装项目中AutomationAddin节点的主输出。 在主输出的属性窗口(我们的C#DLL)中,确保将Register设置为vsdrpCOM。
Excel对象模型简介 对象层次结构 图3-16 Excel对象模型的基本层次结构 一个Workbook对象有一个名为Sheets的集合。 “表”集合可以包含“工作表”或“图表”类型的对象。 图表有时被称为图表,因为它涵盖了工作表将涵盖的整个区域。 您可以通过右键单击Excel工作簿左下角的工作表选项卡并选择“插入”,将工作表插入到工作簿中。 图3-17显示出现的对话框。 请注意,在Sheets集合中还有两个附加对象:MS Excel 4.0宏表和MS Excel 5.0对话框。 如果将宏表单或对话框插入到Excel工作簿中,则将其视为特殊类型的工作表,而不是与宏表或对话框对应的特殊对象模型类型。
因为工作簿可以包含这些各种对象,Excel会从Workbook对象中提供多个集合。 Worksheets集合仅包含工作簿中的Worksheet对象。 “图表”集合仅包含工作簿中的图表。 Sheets集合是两者的混合集合。 Sheets集合将集合的成员作为类型对象返回,您必须将返回的对象转换为工作表或图表。在这本书中,当我们谈论一个可能是工作表或图表的对象时,我们将其称为工作表。 图3-18显示了一个更完整的层次结构树,其主要对象与图3-16中的对象相关联。这将开始让您了解Excel对象模型中对象的广泛层次结构,特别是当您意识到该图显示的可用对象不足一半时。以灰色显示的对象来自Microsoft.Office.Core命名空间,它与Microsoft Office 11.0 PIA(office.dll)相关联。这些对象由所有Office应用程序共享。
图3-19显示了与Range相关联的对象层次结构,这是Excel中非常重要的一个对象,代表您要在代码中处理的单元格范围。 我们已经使用了清单3-2中的RangXe对象。
图3-20显示了与Shapea Shape相关联的对象层次结构,表示浮动在工作表上不是单元格的东西,例如嵌入的按钮,图形,注释气泡等。
结论
|
请发表评论