admin 管理员组

文章数量: 1184232


2023年12月17日发(作者:stroke是什么意思中文翻译成)

…………………………………………………………。 实用第一 智慧密集 摘 要:Excel是一种制作报表的常用软件,XLL插件是扩展Excel功能的一种重要工具。在分析 Excel XLL插件开发方法和可编程接1:2的基础上,对Delphi中实现XLL插件的技术方法进行了介 绍.讨论了XLL插件在管理信息系统开发中的应用。 关键词:Delphi;Excel;插件:报表 xlAutoAdd:当会话期间激活或加载XLL时调用。 1 引言 任何管理信息系统的开发都离不开报表的开发,灵活、复 杂的报表输出是衡量系统功能完善与否的一个重要指标。De1. Dhi是一个高效的可视化数据库管理信息系统开发工具,虽然 xlAutoRemove:当会话期间取消激活或卸载XLL时调用。 xlAddlnManagerlnfo:当首次调用加载项管理器时调用,如 果所传递的参数为1,它应该返回一个字符串表示加载项(即 XLL)名称。 xlAutoRegister:在调用了REGISTER(XLM)或xlfRegister 时调用.该函数提供自定义函数的相关信息,如参数和返回类 型等。 xlAutoFree:Excel收到XLOPER f标记为指向XLL需要释 提供了一些报表组件,但用户在使用报表时基本上不能对报表 格式进行调整。即使能够调整,在设计复杂报表时,这些报表 组件也很难如愿。 Micmsoft Excel是一种常用的电子表格软件,人们经常用 它来制作各种报表,Excel提供了多种方式来扩充其功能, XLL插件是其中之一。Excel自4.0版本以来,一直支持XLL 插件与Excel的链接,XLL插件还支持XLL用来访问Excel函 放的内存1时调用。 前4个函数不带参数且返回Integer值,后3个函数可接 受或返回XLOPER指针。 上述7个标准函数中唯一必需的是xlAutoOpen,没有它就 无法加载XLL。xlAutoFree用于释放XLL管理的内存,在XLL 内分配内存或其他资源时,应该实现xlFree函数来避免内存泄 漏。卸载XLL时,还应实现xlAutoClose来清理内存。其他的 均可忽略。 数和命令的接口(又称C API)。 在分析Excel XLL插件的基础上,给出了一种Excel自定 义报表解决方案。借助于Excel来完成实际报表的设计,由用 户自己设计报表。 2 XLL插件 2.1 标准函数 XLL是指包含Excel加载项管理器所需回调以及XLL导出 命令和工作表函数的动态链接库,一般使用XLL作为扩展名。 XLL是一个标准的win32动态链接库(DU0,但它导出了一些 特殊的函数,这些函数可以被ExceI调用,也可以把自定义的 函数注册到Excel中以扩展Excel的功能。通过XLL可以在 XLL插件可以通过调用Exeel4v函数访问Excel的功能。 2.2函数声明 上述7个标准函数的声明如下: ExCel中添加菜单、工具按钮、自定义函数等等。 Excel加载项管理器负责加载并管理XLL,它会寻找XLL 所导出的以下7个标准函数。 xlAutoOpen:当XLL被装载时调用,在xlAutoOpen函数中 可以注册XLL函数和命令、初始化数据结构以及自定义用户 界面如菜单和工具条等。 xlAutoClose:当XLL被卸载时调用,在xlAutoClose函数 自定义函数的参数和返回值均为PXLOPER,如果自定义 函数Func带一个参数则其函数应声明如下: fUnction FUn (p×:PXEOPER):PXLOPER; 中可以取消函数和命令注册、释放资源和撤消用户界面。 其中PXLOPER是指向XLOPER变体记录的指针,XI OP- 

…… PROG眦嘲U_BI瞩陆…………………………………………………………………………………………… Result =XLAddln。UnRegisterAII; end: ER是一个复杂的变体记录,可以根据SDK提供的xlcal1.h文 件创建。 Excel4 函数声明如下: 3.4自定义函数 function MySQRT(Va}ue:Double):Double;stdcall; begin l lresult:=Sqrt(Value); end; 其中xlfn为调用的函数或功能号,retVal为函数或功能调用 后的返回值,count为opers的参数个数,opers为可变大小的参 数数组。如果调用成功,该函数返回0,否则返回错误代码。 3.5 函数导出 exPo ̄S i //ExceI标准函数 3实现技术 3.1 TXLAddln类 TXLAddln类负责实现XLL插件的基础功能,该类定义以 下公有方法_ xlAutoOpen, xlAutoCIose, //自定义函数/功能 MySQRT; 。 AddFunction方法实现自定义函数的新增。这些新增自定 + 白 … … 白 4 XLL插件的应用 。 ” 一… 在管理信息系统的开发过程中,可以开发Excel的XLL插 件实现3种类型的基本功能及其组合。 义函数由RegisterAll方法注册到Excel中。 AddMenu方法实现自定义菜单的新增,这些新增菜单由 RegisterAll方法注册到Excel中。 4.1 成批数据导出 在XLL插件中实现Excel自定义功能,在Excel中打开一 AddCommand方法实现自定义命令的新增,这些新增命令 由RegisterAll方法注册到Excel中。 AddToolBar方法实现自定义工具条的新增。这些新增工具 条由RegisterAll方法注册到Excel中。 个模态窗E1.用户在该窗口中选择需要导出数据的查询条件、 数据项等,点击按钮后将在Excel中生成导出的数据。 该窗口是一个Delphi标准Form。其开发方法与常规Form 开发方法无异.唯一的区别在于按钮的OnClick事件处理代码需 要通过调用Excel4v函数将数据插入到Excel的相应单元格中。 RegisterAll方法负责将XLL插件中的自定义函数、菜单、 命令和工具条注册到Excel中。该方法由xlAutoOpen标准函数 调用 4.2成批数据导入 在XLL插件中实现Excel自定义功能,在Excel中打开一 个模态窗口.用户在该窗口中选择从Excel中导人数据的单元 格范围、数据项和目标等,点击按钮后将Excel中指定的数据 导入到指定的数据库表中(插入或修改)。 该窗口是一个Delphi标准Form,其开发方法与常规Form 开发方法无异.唯一的区别在于按钮的OnClick事件处理代码 需要通过调用Excel4v函数从Excel单元格中读取数据。 UnregisterAll方法负责将XLL插件中的自定义函数、菜单、 命令和工具条从Excel中取消注册,该方法由xlAutoCloSe标准 函数调用。 3.2 xlAutoOpen标准函数 4.3自定义报表编制 其中XLAddln是XLL的全局变量,PTepareData实现XIJIJ 在XLL插件中实现Excel自定义函数和功能,用户使用 XLL插件提供的自定义函数、功能和Excel提供的各种函数自 行编制报表。报表格式则完全由用户定义,能够满足用户对报 自定义函数、菜单、命令和工具条的内部定义,例如 XLAddln.AddFunction("MySQRT , BB "MySQRT , Number', "Demo')将增加一个自定义函数.第一个参数为XIJL导出的函 数名:第二个参数为返回值和参数类型(返回值和参数均为 表格式的各种需求。 Double):第三个参数为Excel中的函数名;第四个参数为Ex. cel函数向导中显示的参数名;第五个参数为Excel函数向导中 的函数类别。还可以定义函数及其参数的帮助说明。 3.3 xlAutoClose标准函数 function xlAutoCIoseO:Intege stdcall begin 图1 XLL插件实际运行效果屏幕截图 (下转第17页) 

…… PROGRAM LANGUAGE …………… ………………………………………………………… ………………… If(mxb_bx=shu—ru—shu ju_bx)Then found_mxflag=True _”找到相应的明细,进行处理” Cells mxbgs:gs—mxbsheet.__gxduiy- _ing_gsmxbco1) _取工时明细表中对应工序和泵型所确定的工时值 s_)=mxb_gs sheet.Cells(i,scgs_co1__将找到的工时值,填人源表中当前行的工时列对应的单元格中 s-sheet.Cells( ,S_C—gz_co1)=mxb_gs s_sheet.Cells(i s_c_shuliang_co1) s_根据计件数量和工时,计算工资结果 sheet.Cells(i,stflagcol}=t_flag ___将已统计标记填入源表中相应的标记列中 Exit lFor End If End 1If Nexti If found—mx_flag=False Then 如果没有找到需要的明细,给出提示 MsgBox“此次工时明细表遍历至末尾”& 且没有 找到: &shu—ru_shu_ju_gx&”和 &shuru_—shuju_bx&” _相应的明细l程序会继续执行” End If Else 当选择的工时明细表是“工序 工时明细表)”时,进行如 下处理 found第2)部分按2个或3个条件进行数据分类统计和排序的 mx_—flag=False maxrow_模块。程序代码详解请参见第一稿关于对条件分类统计和排序 gs_mxbsheet.Cells. _gs—mxb_count=的内容。 SpecialCells(xlCellTypeLastCel1)..Row 取工时明细表的最大行数 For j=2 To gs_mxb_max_row_coUnt 遍历工时明 细表的所有行即所有工序,找到源表中当前工序在工时明细表 中的行位置 If gsmxb__3 结语 因为Excel默认的宏“安全级”最高,不允许执行自定义 的宏程序。所以在使用自定义的宏程序之前,需要经过选择菜 sheet.Cells(j,1): Then __单上的“工具”l“选项”I“安全性”I“宏安全性”.将“安全 级”降至低,保存文件后关闭再打开,即可正常使用自定义的 宏程序。对于条件文件中的源表名称和目的表名称.要特别注 意其字符中符号的大小写,最好使用对工作表名称的复制和粘 贴方法,避免输入时出现错误。 (收稿日期:2010—10—05) MsgBox gsmxbsheet_name&”第 &j& 行发现空白行j继续操作} Else mxbgx:gs—mxb__sheet.Cells(j,1) 取工时明细表中的工序 If《mxb-gx=shu_ru—shu_ju_gx)Then (上接第13页) 图1为示例XLL的实际运行效果屏幕截图,在Excel中增 计出各种各样满足其实际业务需求的自定义报表。定能为应用 程序增光添彩。 加了“Excel报表系统”菜单项,Bl单元格则使用自定义函数 MySQRT计算A1单元格的平方根。 参考文献 ton.Excel Add-in Development in C/C++.John 【 】 Steve DalWiley&Sons Ltd.2005. 5结语 XLL是一个需要导出特定函数的标准Win 32动态链接库, 其开发比较简单。通过Excel提供的可编程接口完成应用程序 和Excel之间的相互操作,可以控制Excel实现与应用程序之 间的数据交换,将报表的设计完全交给用户完成,用户能够设 【2】Microsoft Corporation.Microsoft Excel 97 Developers Kit.Mi- crosoft Press.1997. [3】陈省.Delphi深度探索.北京:电子工业出版社,2004. (收稿日期:2010—10—17) 


本文标签: 函数 报表 参数 工时 数据