VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式
原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式
Excel包含很多公式,如数学、日期、文本、逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果。Excel的内置公式虽然强大,但是在ERP等系统中,往往需要进行很多业务上的计算,如收发存台账、指定年、月、部门的消耗查询等,都是需要从数据库中查询的,且和业务紧密相连。这时仅仅依靠Excel的内置公式就不够了,需要添加自定义的公式来进行这些业务计算。
本系列所有测试代码均在Visual Studio 2010 Ultimate + Office 2010 Professional Plus x64 上测试通过
转载请注明出处: http://www.cnblogs.com/brooks-dotnet/archive/2011/01/16/1936871.html
Exel允许我们创建用户自定义函数,并用到Excel公式中。
一、VBA
不使用VSTO,只用经典的VBA就可以编写Excel自定义函数。VBA我没有研究过(接触开发较晚,错过了VBA时代),感兴趣的朋友请自行搜索,有很多示例。
二、XLL
XLL是Excel的加载宏文件,是一个标准dll,主要使用C++开发。为此,微软提供了Excel 2010 XLL SDK,可以在这里下载。
虽然微软官方不推荐使用.NET来开发XLL,但是有人在CodePlex上发布了一个开源项目ExcelDNA,可以使用.NET来开发XLL。不过网上有人说貌似不支持Excel 2010 x64,待后续验证。
三、XLW
XLW(A Wrapper for the Excel API)是一个C++语言对Excel的开发者工具包(SDK)的一个封装,简化了C++程序操作Excel文档的方法,XLW4.0已经支持Excel 2007。使用XLW可以很方便的使用C++对Excel功能进行扩展,首先它提供了一个模板生成器xlwTemplateExtractor.exe,可以生成相应的工程文件,然后又具有一个接口生成器InterfaceGenerator.exe来自动生成相应的接口包装文件(xlwWrapper.cpp),从而大大减少了只使用Excel SDK来完成XLL开发所需的相关代码,降低了开发难度,避免一些错误的产生。
官方说明只支持到Excel 2007,估计Excel 2010 x64没戏了,期待后续更新。
四、.NET
VSTO的出现大大提高了开发人员的效率,我们可以享受现代开发工具带来的快捷与方便。借助于COM可以使用托管代码来开发Excel自定义公式。
4.1、打开VS2010,新建一个Class Library项目:

4.2、添加COM相关的特性:
[Guid("DDE8AA59-9860-44B3-B1AF-923ABB4A8EEE")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
注意要生成一个GUID:

这里我使用的LinqPad,一个轻量级的IDE,支持C#、VB.NET、Linq、F#、SQL语句,非常适合用来测试少量代码。
4.3、写一个简单的函数,返回两个整数的和:
public int AnotherSumFunc(int a, int b)
{
return a + b;
}
4.4、添加COM注册与反注册函数:
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
var key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
key.SetValue("", Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
}
[ComUnregisterFunction]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
}
private static string GetSubKeyName(Type type, string subKeyName)
{
var s = new System.Text.StringBuilder();
s.Append(@"CLSID\{");
s.Append(type.GUID.ToString().ToUpper());
s.Append(@"}\");
s.Append(subKeyName);
return s.ToString();
}
这两个函数的格式是固定的,为了向注册表中添加必须的键值。
4.5、修改项目属性,取消COM注册:

4.6、编译项目。
4.7、32位的Excel可以选中上述复选框来自动注册,从Excel 2010 x64开始,我们需要手动注册该dll。
在DOS下输入:cd /d %windir%\Microsoft.NET\Framework64\v4.0.30319

4.8、使用regasm来注册我们的dll:

出现警告是因为未签名,因为是测试就没有进行签名,如果是正式部署则一定要进行签名。
下述说明摘自MSDN,原文地址:http://msdn.microsoft.com/zh-cn/library/tzat5yw6(v=VS.100).aspx。
Regeasm.exe 是一个程序集注册工具,Regeasm.exe读取程序集中的元数据,并将所需的项添加到注册表中。注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。 类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。 类仅在安装程序集时注册一次。 程序集中的类实例直到被实际注册时,才能从 COM 中创建。
regasm assemblyFile [options]
assemblyFile
要向 COM 注册的程序集。
选项说明
/codebase
在注册表中创建一个 Codebase 项。 Codebase 项指定未安装到全局程序集缓存中的程序集的文件路径。 如果随后要安装正在注册到全局程序集缓存中的程序集,则不应指定此选项。 用 /codebase 选项指定的 assemblyFile 参数必须是具有强名称的程序集。
/registered
指定此工具将仅引用已经注册的类型库。
/asmpath:directory
指定包含程序集引用的目录。 必须和 /regfile 选项一起使用。
/nologo
取消显示 Microsoft 启动标题。
/regfile [:regFile]
为程序集生成指定的 .reg 文件,该文件包含所需的注册表项。 指定此选项不更改注册表。 此选项不能与 /u 选项或 /tlb 选项一起使用。
/silent 或 /s
取消显示成功消息。
/tlb [:typeLibFile]
从指定的程序集生成类型库,该类型库包含在程序集中定义的可访问类型的定义。
/unregister 或 /u
注销在 assemblyFile 中找到的可创建类。 省略此选项将导致 Regasm.exe 注册程序集中的可创建类。
/verbose
指定详细模式;当用 /tlb 选项指定时,显示所有需要为其生成类型库的引用程序集的列表。
/?或 /help
显示该工具的命令语法和选项。
4.9、在Excel中激活该公式
打开一个Excel文件,若尚未显示"Developer(开发人员)"选项卡,则可以通过在Ribbon – 右键 – "Custom the Ribbon" – "选中Developer"来显示:


在Developer选项卡中,点击【Add-Ins】:

点击【Automation】选择我们编写的自定义函数:

选中该函数,点击【OK】:

回到Excel中,在一个单元格的公示栏中输入:=AnotherSumFunc(1,2),回车,可以看到得到了我们期望的结果:3

4.10、删除自定义函数
若该函数我们不想要了,要删除怎么办呢?只需在CMD中反注册dll:

4.11、调试自定义函数
在项目属性的Debug选项卡中,将扩展启动程序设置为Excel 2010 x64的路径:

F5运行,会自动打开Excel,当我们输入该自定义函数时,会自动进入断点:

除此之外,还可以通过附加Excel的进程来进行调试。
小结:
Office 2010首次推出的64位版本的Office在带给我们欣喜的同时,也带来了版本维护成本的提升。因此VSTO程序的向后兼容性就显得尤为重要,Excel自定义函数只是冰山一角。后续篇章会讨论下Office插件的兼容性问题,以及从VBA转向VSTO的解决方案。
VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式的更多相关文章
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Vue学习笔记十一:按键修饰符和自定义指令(钩子函数)
目录 padStart:补位 按键修饰符 Vue提供的按键修饰符 自定义按键修饰符 自定义指令 自定义指令的使用 钩子函数 钩子函数参数 使用钩子函数的bingding参数 私有自定义指令 钩子函数的 ...
- VSTO 学习笔记(十)Office 2010 Ribbon开发
原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...
- 【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发
微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可 ...
- VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表
原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...
- VSTO学习笔记(五)批量编辑Excel 2010 x64
原文:VSTO学习笔记(五)批量编辑Excel 2010 x64 近期因为工作的需要,经常要批量处理大量的Excel文件,如果纯手工一个个修改,非常的麻烦,于是写了这么一个帮助类,希望能对你有所帮助. ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...
- VSTO学习笔记(二)Excel对象模型
原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
随机推荐
- VC 对话框背景颜色、控件颜色
系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色 ...
- Reader开发(二)增加PDF阅读功能
最近任务很多很忙,所以更新博客的速度很慢. 大概上周就为Reader加了一个PDF阅读的功能,但是一直没时间写上来.昨晚找一下文件发现扩展了功能的Demo居然在文件目录下看不到任何文件,但是却显示有文 ...
- HDU1686——Oulipo
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- Cocos2d-x教程(30)-3.x版本号物理引擎的使用
转载时请注明原文出处 : http://blog.csdn.net/u012945598/article/details/38417333 在Cocos2d-x 2.x的版本号中,开发人员能够直接使用 ...
- [ACM] n划分数m部分,它要求每一个部分,并采取了最大的产品(间隔DP)
A - 爱管闲事 春希很爱管闲事,他每天都会抽出时间帮助一些同学,因为春希很死板,出于公平性,春希不会先帮助后来找他的同学. 如今有n个同学须要他的帮助,尽管他非常想一天之类帮助全部人,但毕竟精力有限 ...
- Swift - 判端网络连接状态,连接类型(3G还是Wifi)
IJReachability是一个使用Swift写的第三方网络检测类.可以测试网络是否连接,并支持3G和Wifi的检测. 使用样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Android SurfaceView实战 打造抽奖转盘
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...
- [置顶] 遇到难题(bug)的解决方法心得
今天早上花了2个小时解决一个问题...界面抖动.. 最近把淄博项目的界面用BT改了,后来发现4个界面之间切换会抖动.. 就是整个界面会左右抖动... 文章出处: PHP攻城师 www.phpgcs.c ...
- MSSQL - SQL Server2008附加数据库失败 错误号:5120
附加数据库时,显示错误,错误信息为 一种解决方法为,设置mdf文件所在文件夹的权限(有些资料说只设置mdf文件的权限就好,但我试了不管用),在文件夹上右击——属性——安全,如图所示: 选择组或用户名中 ...
- 修改合同号的bapi
这个例子是在合同号中新增项目号: 1.先要读取该合同号的信息用一个BAPI BAPI_CONTRACT_GETDETAIL 2.调用修改合同号的BAPI. 代码如下: REPORT ztest_cla ...