在 Excel 中开发加载项 XLLWord文档格式.docx
《在 Excel 中开发加载项 XLLWord文档格式.docx》由会员分享,可在线阅读,更多相关《在 Excel 中开发加载项 XLLWord文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
XLL概述
Excel2007中XLL的变化
编写跨版本XLL
编写线程安全XLL和工作表函数
结束语
在Excel2007中开发XLL
本
文的目标受众是已经具备MicrosoftOfficeExcel加载项或XLL开发经验的MicrosoftVisualC和
MicrosoftVisualC++开发人员。
本文尽管对XLL开发有一些简要的概述,但其宗旨并非介绍XLL
的开发。
要完全掌握本文要旨,读者应熟悉以下内容:
C和C++语言概念和结构。
本文的代码示例是用C++编写的。
构建用于导出函数的DLL。
XLOPER数据结构和其他Excel数据类型,例如浮点矩阵结构(FP)。
加载项管理器接口函数,例如xlAutoOpen和xlAutoClose。
XLOPER内存管理(xlAutoFree、xlFree以及xlbitDLLFree和xlbitXLFree的应用)。
返回页首
Excel2007中XLL相关功能概述
MicrosoftOfficeExcel2007中XLL相关功能最明显的变化是工作表单元格从224个扩展到234个,或者更准确地说,工作表从256列x65,536行(28x216)扩展到16,384x1,048,576(214x220)。
这些新限制会溢出以旧的范围和数组结构来容纳它们的整数类型。
这一变化需要支持数位更多的整数的新数据结构来定义范围和数组大小。
函数可使用的最大参数数从30增加到255。
此外,XLL现在可与Excel交换长Unicode字符串而不是长度有限的字节串。
单
处理器和多处理器均支持多线程工作簿重新计算。
与MicrosoftVisualBasicforApplications(VBA)
用户定义函数(UDF)不同的是,XLLUDF可以注册为线程安全模式。
而与Excel
中的大多数内置工作表函数一样的是,它们可以分配给并发线程来加快重新计算的速度。
上述改进带来益处的同时也附带一些限制,而且不可以滥用多线程权限进行
不安全操作。
现在,尽管数据分析工具仍需要AnalysisToolpak加载项,但其函数实际已经完全集成到Excel中。
这就使得针对早期版本开发的XLL(使用xlUDF调用ATP函数)出现不兼容情况。
用户界面也有了显著的变化。
对于用户界面的定制,本文将不予介绍,但要说明的是,旧的XLL自定义菜单和菜单项仍然可用,但并未放在旧的C应用程序编程接口(API)函数所在位置。
XLL概述
Microsoft
Excel自4.0版本以来,一直支持XLL与Excel的链接。
此外,这些软件还支持XLL用来访问Excel
函数和命令的接口(又称CAPI)。
XLL是指包含Excel加载项管理器所需回调以及XLL导出命令和工作表函数的DLL。
自
Excel5.0以来,此接口一直没有明显的变化。
目前,Excel2007的许多新功能以及早期版本的一些先前不支持的功能在更新的C
API中都可以使用。
本文介绍了新CAPI的新增功能并讨论了开发人员所遇到的一些有关迁移的问题。
Microsoft随Excel97发布了一个软件开发工具包(SDK),这是先前SDK版本的升级版,其中包括以下组件:
A
C头文件xlcall.h,包含Excel用来与XLL交换数据的数据结构定义;
与内置Excel工作表函数、XLM
信息函数和许多命令相应的枚举函数和命令定义;
以及Excel回调函数Excel4、Excel4v和XLCallVer的原型。
静态导入库,xlcall32.lib。
Excel回调以C名称修饰从此库导出。
XLLSDKFramework项目,其中包含完整的XLL项目和许多用于处理Excel数据类型和帮助调用Excel4和Excel4v的例程。
最
简单的XLL是在加载加载项时用于导出Excel所调用函数的XLL:
xlAutoOpen。
此函数执行初始化任务并注册XLL
所导出的任何函数和命令。
这要求加载项调用XLM函数REGISTER()的CAPI等效命令。
Excel库
(xlcall32.dll)负责将允许XLL回调的函数导出到Excel,这些函数包括:
Excel4和Excel4v(表示最初引入
XLL功能时其版本为4,而目前Excel2007中的Excel12和Excel12v对其进行了补充)。
Excel加载项管理器负责加载并管理XLL。
它会寻找XLL所导出的以下函数:
xlAutoOpen:
加载XLL时调用。
最适于注册XLL函数和命令、初始化数据结构和自定义用户界面。
xlAutoClose:
缷载XLL时调用。
用于取消函数和命令注册、释放资源和撤消自定义。
xlAutoAdd:
会话期间激活或加载XLL时调用。
xlAutoRemove:
会话期间取消激活或缷载XLL时调用。
xlAddInManagerInfo(xlAddInManagerInfo12):
首次调用加载项管理器时调用。
如果所传递的参数为1,它会返回一个字符串(加载项名称),否则将返回#VALUE!
xlAutoRegister(xlAutoRegister12):
在调用了REGISTER(XLM)或xlfRegister(CAPI)时调用,无函数返回值和参数类型。
它会在内部搜索XLL以便用所提供的信息注册函数。
xlAutoFree(xlAutoFree12):
Excel收到XLOPER(标记为指向XLL需要释放的内存)时调用。
后三个函数可接受或返回XLOPER。
在Excel2007中,XLOPER和XLOPER12均支持这三个函数。
这些函数中唯一必需的是xlAutoOpen,没有它就无法加载XLL。
在DLL内分配内存或其他资源时,还应实现xlFree(xlFree12)来避免内存泄漏。
缷载XLL时,还应实现xlAutoClose来清理内存。
其他的均可忽略。
C
API因以下原因而得名:
Excel使用一些标准的C数据类型来交换数据;
库函数用C名称修饰;
数据结构为ANSI
C。
在具备了适当经验的情况下,使用C++可增强XLL项目的易管理性、可读性和稳定性。
因此,本文的剩余部分假定读者对C++
类有一定的了解。
表1总结了Excel用来与XLL交换数据的数据结构,并提供了在注册工作表UDF时在第三个参数中传递给xlfRegister的类型字母。
表1.用来与XLL交换数据的Excel数据结构数据类型
传递数值
传递引用(指针)
注释Boolean
L
short(0=falseor1=true)Double
B
E
-char*
-
C,F
以Null值结尾的ASCII字节串unsignedchar*
D,G
计数ASCII字节字符串[v12+]unsignedshort*
C%,F%
以Null值结尾的Unicode宽字符字符串[v12+]unsignedshort*
D%,G%
计数Unicode宽字符字符串unsignedshort[int]
H
DWORD、size_t、wchar_t[signed]short[int]
I
M
16位[signedlong]int
J
N
32位FP
K
浮点数组结构[v12+]FP12
K%
更大网格浮点数组结构XLOPER
—
P
R
变量类型的工作表值和数组
值、数组和范围引用[v12+]XLOPER12
Q
U
值、数组和范围引用