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