使用COM接口调用OpenOffice
2019-08-10王成华滑永振
王成华 滑永振
摘要:针对报表软件要支持免费软件OpenOffice的需求,本文介绍了使用COM接口操作OpenOffice软件的方法和注意事项。在调用COM接口时,运用安全数组技术为接口函数传递参数。在操作OpenOffice表格文档时,利用多单元格的操作,大大提高了写入速度。本文还介绍了OpenOffice中结构体的使用方法。
关键词:COM接口;UNO 组件技术;安全数组
中图分类号:TP3 文献标识码:A
文章编号:1009-3044(2019)17-0273-02
开放科学(资源服务)标识码(OSID):
Abstract: In order to reporting software to support free software OpenOffice requirements, this paper describes the method of operating OpenOffice through calling the COM interface and the precautions. When calling COM interface, use SAFEARRAY for passing parameters for the interface function. When operating OpenOffice document, multi-cell operating improves writing speed a lot. This article also describes the method of using OpenOffice structure.
Key words: COM Interface; UNO Component Technology; SAFEARRAY
1前言
随着社会的发展,版权意识的加强,越来越多的人喜欢使用免费、开源的软件产品。表格工具在很多软件中都会被使用,为了迎合该思想,报表软件需要增加对开源报表软件的支持。
2 OpenOffice介紹
OpenOffice,是一套免费的、自由的、跨平台的办公软件套件,其中的表格软件为:Calc。
OpenOffice通过组件技术UNO(通用网络对象)提供了开发接口。从 OpenOffice 1.1.0 开始,OpenOffice对组件扩展提供全面支持 [1]。UNO 提供桥,用于在用不同实现语言编写的进程之间以及对象之间发送方法调用和接收返回值。
OpenOffice 是一种与平台无关的应用程序,它的文件路径采用URL表示法。以前缀 file:/// 开头,后跟本地路径。如果文件名包含子目录,则使用单个正斜杠(而不是 Windows 中通常使用的反斜杠)分隔这些子目录。例如:file:///C:/doc/test.ods。
此路径表示C盘下的doc目录下的test.ods文档。用户可以自己组织文件路径,也可以调用OpenOffice为用户提供的将本地路径转化成URL路径的函数:ConvertToUrl[1]。
OpenOffice 提供了数百种服务。为了提供这些服务的概要信息,OpenOffice将这些服务合并为模块。一个模块中会存在一种或者多种服务,程序员在使用这些服务时,服务名称要包含其模块名,完整的服务名称由以下部分组成:com.sun.star.表达式。
3利用COM接口操作OpenOffice
3.1 COM接口的调用
COM,即组件对象模型,是一种以组件为单元的对象模型,这种模型使各软件可以用一种统一的方式进行交互[3]。在VC中,通过IDispatch::Invoke函数来调用接口函数[3]。COM接口的调用流程描述如下:
2. 新建表格文档
3. 对文档进行操作。
在使用OpenOffice的文档时,有一个服务和一个接口最为常用:
com::sun::star::frame::Desktop服务:它与OpenOffice的内核服务类似,为OpenOffice的框架对象提供了一些功能,根据这些功能,对所有的文档进行了分类。使用该服务,可以创建、打开和导出文档。在用COM接口操作OpenOffice时,必须启动该服务。
com::sun::star::frame::XcomponentLoader接口:主桌面程序接口,主要包含loadComponentFromURL方法,负责创建、导入和打开文档。
在VC用,利用CLSID通过函数CoCreateInstance()或者CoCreateInstanceEx()可以创建OpenOffice的对象。OpenOffice安装后可以在注册表中得到它的注册信息,包括了CLSID、PROGID等。启动、操作OpenOffice的过程描述如下:
在调用接口loadComponentFromURL时注意到,最后一个参数是结构体的数组变量。在接口的使用中,传递数组型参数需要使用安全数组。
OpenOffice的结构体com.sun.star.beans.PropertyValue存储了一些属性值,设定不同的属性值实现不同的功能,例如,我们在打开OpenOffice的文档时,可以设置PropertyValue的属性名为“Hidden”,属性值设定为:TRUE,那么这个文档将以隐藏的方式被创建或打开。
3.3结构体的使用
OpenOffice提供的接口函数中,经常遇到参数为一个结构体对象的情况,例如前面提到的loadComponentFromURL()函数。OpenOffice的结构体又该如何操作呢?
OpenOffice为用户提供了创建结构体对象的接口函数:Bridge_GetStruct(),此函数由服务管理器对象提供,通过这个函数,可以得到结构体接口指针。注意:在为函数Bridge_GetStruct()传递参数时,结构体的路径要求为包含所属组件的详细路径。例如创建结构体PropertyValue的一个数组对象时,Bridge_GetStruct的参数应为:"com.sun.star.beans.PropertyValue"。
OpenOffice的服务管理器还提供了一种可以创建结构对象的服务:com.sun.star.reflection.CoreReflection。通过服务管理器对象创建此服务的对象亦可得到结构的对象。操作描述如下:
通过上面的两种方法我们都可以创建一个结构的对象,通过VC的函数CComDispatchDriver::PutProperty()为结构对象赋值,同时VC的也提供了读取结构属性值的函数:CComDispatchDriver:: GetProperty。
介绍一个关于读取的例子。在操作Calc時,经常需要得到表格中已使用的行列个数。在OpenOffice中没有直接得到这个属性的函数,但函数getRangeAddress可以得到CellRange的信息,返回值为结构CellRangeAddress的对象。CellRangeAddress包含如下信息:Sheet索引、开始行数、结束行数、开始列数、结束列数。利用该指针,通过VC函数CComDispatchDriver:: GetProperty可以得到结构体属性的值。
3.4 效率提升:二维数组参数的传递
在用VC往表格内写入数据量较大时,Calc的写入速度很慢,效率很低。为了提升读写速度,OpenOffice提供了区域读写方案:setDataArray,可以往CellRange(单元格范围)中一次性写入全部数据。setDataArray的参数是一个Any类型的二位数组。Any类型是OpenOffice定义的一种数据类型,其功能和C++ 中的VARIANT相似,表示多类型。setDataArray的参数可以为string类型和float类型。二维数组的第一维元素个数为CellRange的行数(即rows),第二维的元素个数为CellRange的列数(即Columns)。
4结束语
本文讲述了通过COM接口用VC调用OpenOffice的思想,及一些操作方式。COM组件具有与语言无关性和与平台无关性,它可以给任何程序、任何系统提供服务,故COM组件技术被广泛应用于是跨平台开发。OpenOffice的免费性、跨平台性,让更多的用户选择了它,系统支持OpenOffice也是一个趋势。
参考文献:
[1] OpenOffice.org 3.1 SDK
[2] Microsoft.MSDN Library
[3] 潘爱民.COM原理与应用[M].北京:清华大学出版社,2000.
【通联编辑:梁书】