王成華 滑永振
摘要:針對(duì)報(bào)表軟件要支持免費(fèi)軟件OpenOffice的需求,本文介紹了使用COM接口操作OpenOffice軟件的方法和注意事項(xiàng)。在調(diào)用COM接口時(shí),運(yùn)用安全數(shù)組技術(shù)為接口函數(shù)傳遞參數(shù)。在操作OpenOffice表格文檔時(shí),利用多單元格的操作,大大提高了寫入速度。本文還介紹了OpenOffice中結(jié)構(gòu)體的使用方法。
關(guān)鍵詞:COM接口;UNO 組件技術(shù);安全數(shù)組
中圖分類號(hào):TP3? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)17-0273-02
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(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前言
隨著社會(huì)的發(fā)展,版權(quán)意識(shí)的加強(qiáng),越來越多的人喜歡使用免費(fèi)、開源的軟件產(chǎn)品。表格工具在很多軟件中都會(huì)被使用,為了迎合該思想,報(bào)表軟件需要增加對(duì)開源報(bào)表軟件的支持。
2 OpenOffice介紹
OpenOffice,是一套免費(fèi)的、自由的、跨平臺(tái)的辦公軟件套件,其中的表格軟件為:Calc。
OpenOffice通過組件技術(shù)UNO(通用網(wǎng)絡(luò)對(duì)象)提供了開發(fā)接口。從 OpenOffice 1.1.0 開始,OpenOffice對(duì)組件擴(kuò)展提供全面支持 [1]。UNO 提供橋,用于在用不同實(shí)現(xiàn)語言編寫的進(jìn)程之間以及對(duì)象之間發(fā)送方法調(diào)用和接收返回值。
OpenOffice 是一種與平臺(tái)無關(guān)的應(yīng)用程序,它的文件路徑采用URL表示法。以前綴 file:/// 開頭,后跟本地路徑。如果文件名包含子目錄,則使用單個(gè)正斜杠(而不是 Windows 中通常使用的反斜杠)分隔這些子目錄。例如:file:///C:/doc/test.ods。
此路徑表示C盤下的doc目錄下的test.ods文檔。用戶可以自己組織文件路徑,也可以調(diào)用OpenOffice為用戶提供的將本地路徑轉(zhuǎn)化成URL路徑的函數(shù):ConvertToUrl[1]。
OpenOffice 提供了數(shù)百種服務(wù)。為了提供這些服務(wù)的概要信息,OpenOffice將這些服務(wù)合并為模塊。一個(gè)模塊中會(huì)存在一種或者多種服務(wù),程序員在使用這些服務(wù)時(shí),服務(wù)名稱要包含其模塊名,完整的服務(wù)名稱由以下部分組成:com.sun.star.表達(dá)式。
3利用COM接口操作OpenOffice
3.1 COM接口的調(diào)用
COM,即組件對(duì)象模型,是一種以組件為單元的對(duì)象模型,這種模型使各軟件可以用一種統(tǒng)一的方式進(jìn)行交互[3]。在VC中,通過IDispatch::Invoke函數(shù)來調(diào)用接口函數(shù)[3]。COM接口的調(diào)用流程描述如下:
2. 新建表格文檔
3. 對(duì)文檔進(jìn)行操作。
在使用OpenOffice的文檔時(shí),有一個(gè)服務(wù)和一個(gè)接口最為常用:
com::sun::star::frame::Desktop服務(wù):它與OpenOffice的內(nèi)核服務(wù)類似,為OpenOffice的框架對(duì)象提供了一些功能,根據(jù)這些功能,對(duì)所有的文檔進(jìn)行了分類。使用該服務(wù),可以創(chuàng)建、打開和導(dǎo)出文檔。在用COM接口操作OpenOffice時(shí),必須啟動(dòng)該服務(wù)。
com::sun::star::frame::XcomponentLoader接口:主桌面程序接口,主要包含loadComponentFromURL方法,負(fù)責(zé)創(chuàng)建、導(dǎo)入和打開文檔。
在VC用,利用CLSID通過函數(shù)CoCreateInstance()或者CoCreateInstanceEx()可以創(chuàng)建OpenOffice的對(duì)象。OpenOffice安裝后可以在注冊(cè)表中得到它的注冊(cè)信息,包括了CLSID、PROGID等。啟動(dòng)、操作OpenOffice的過程描述如下:
在調(diào)用接口loadComponentFromURL時(shí)注意到,最后一個(gè)參數(shù)是結(jié)構(gòu)體的數(shù)組變量。在接口的使用中,傳遞數(shù)組型參數(shù)需要使用安全數(shù)組。
OpenOffice的結(jié)構(gòu)體com.sun.star.beans.PropertyValue存儲(chǔ)了一些屬性值,設(shè)定不同的屬性值實(shí)現(xiàn)不同的功能,例如,我們?cè)诖蜷_OpenOffice的文檔時(shí),可以設(shè)置PropertyValue的屬性名為“Hidden”,屬性值設(shè)定為:TRUE,那么這個(gè)文檔將以隱藏的方式被創(chuàng)建或打開。
3.3結(jié)構(gòu)體的使用
OpenOffice提供的接口函數(shù)中,經(jīng)常遇到參數(shù)為一個(gè)結(jié)構(gòu)體對(duì)象的情況,例如前面提到的loadComponentFromURL()函數(shù)。OpenOffice的結(jié)構(gòu)體又該如何操作呢?
OpenOffice為用戶提供了創(chuàng)建結(jié)構(gòu)體對(duì)象的接口函數(shù):Bridge_GetStruct(),此函數(shù)由服務(wù)管理器對(duì)象提供,通過這個(gè)函數(shù),可以得到結(jié)構(gòu)體接口指針。注意:在為函數(shù)Bridge_GetStruct()傳遞參數(shù)時(shí),結(jié)構(gòu)體的路徑要求為包含所屬組件的詳細(xì)路徑。例如創(chuàng)建結(jié)構(gòu)體PropertyValue的一個(gè)數(shù)組對(duì)象時(shí),Bridge_GetStruct的參數(shù)應(yīng)為:"com.sun.star.beans.PropertyValue"。
OpenOffice的服務(wù)管理器還提供了一種可以創(chuàng)建結(jié)構(gòu)對(duì)象的服務(wù):com.sun.star.reflection.CoreReflection。通過服務(wù)管理器對(duì)象創(chuàng)建此服務(wù)的對(duì)象亦可得到結(jié)構(gòu)的對(duì)象。操作描述如下:
通過上面的兩種方法我們都可以創(chuàng)建一個(gè)結(jié)構(gòu)的對(duì)象,通過VC的函數(shù)CComDispatchDriver::PutProperty()為結(jié)構(gòu)對(duì)象賦值,同時(shí)VC的也提供了讀取結(jié)構(gòu)屬性值的函數(shù):CComDispatchDriver:: GetProperty。
介紹一個(gè)關(guān)于讀取的例子。在操作Calc時(shí),經(jīng)常需要得到表格中已使用的行列個(gè)數(shù)。在OpenOffice中沒有直接得到這個(gè)屬性的函數(shù),但函數(shù)getRangeAddress可以得到CellRange的信息,返回值為結(jié)構(gòu)CellRangeAddress的對(duì)象。CellRangeAddress包含如下信息:Sheet索引、開始行數(shù)、結(jié)束行數(shù)、開始列數(shù)、結(jié)束列數(shù)。利用該指針,通過VC函數(shù)CComDispatchDriver:: GetProperty可以得到結(jié)構(gòu)體屬性的值。
3.4 效率提升:二維數(shù)組參數(shù)的傳遞
在用VC往表格內(nèi)寫入數(shù)據(jù)量較大時(shí),Calc的寫入速度很慢,效率很低。為了提升讀寫速度,OpenOffice提供了區(qū)域讀寫方案:setDataArray,可以往CellRange(單元格范圍)中一次性寫入全部數(shù)據(jù)。setDataArray的參數(shù)是一個(gè)Any類型的二位數(shù)組。Any類型是OpenOffice定義的一種數(shù)據(jù)類型,其功能和C++ 中的VARIANT相似,表示多類型。setDataArray的參數(shù)可以為string類型和float類型。二維數(shù)組的第一維元素個(gè)數(shù)為CellRange的行數(shù)(即rows),第二維的元素個(gè)數(shù)為CellRange的列數(shù)(即Columns)。
4結(jié)束語
本文講述了通過COM接口用VC調(diào)用OpenOffice的思想,及一些操作方式。COM組件具有與語言無關(guān)性和與平臺(tái)無關(guān)性,它可以給任何程序、任何系統(tǒng)提供服務(wù),故COM組件技術(shù)被廣泛應(yīng)用于是跨平臺(tái)開發(fā)。OpenOffice的免費(fèi)性、跨平臺(tái)性,讓更多的用戶選擇了它,系統(tǒng)支持OpenOffice也是一個(gè)趨勢(shì)。
參考文獻(xiàn):
[1] OpenOffice.org 3.1 SDK
[2] Microsoft.MSDN Library
[3] 潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,2000.
【通聯(lián)編輯:梁書】