2011年3月19日

OpenOffice Macro API(UNO)架構說明

承接前一篇,在知道了簡單的開發環境和程式流程後,
這篇簡單的介紹OpenOffice Macro的API的架構,
瞭解架構後,可以比較容易瞭解API怎麼使用。

要接觸OpenOffice BASIC前,
我原本認為它的BASIC語法應該會跟VBA差不多,
學習下去後才發現,它跟VBA完全不同,類似的只有基本語法,
但API的使用,操作完全不同,基本上沒辦法無痛,
一定要下去瞭解UNO才有辦法使用。

OOo(OpenOffice.org簡稱)的Macro支援很多套程式語言,
包括:BASIC、Java、Java Script、C++、Java BeanShell Script

它們的核心,都是呼叫OOo提供的一整套API,
這套API被稱為UNO(Universal Network Objects),
透過UNO,上述所有語言都能呼叫和操作OpenOffice,
好處是跨語言,壞處是,就算只是想學BASIC,也得瞭解UNO。

如果先前學的是Java,要瞭解UNO很容易,UNO不愧是Sun設計的,
很有Java的概念。

一般來說,常見的UNO概念圖如下:

這裡我不得不說,我第一次看得時候,看一眼就沒興趣了,
但事實上它只是描述了一個簡單的架構。

UNO(Universal Network Objects),我猜測,
也許是為了要設計一個能跨平台使用的溝通模式,
又因為是Sun,所以以Java的物件導向為架構,用網路來實做,
我想用網路而不用其他溝通機制的原因,
應該是因為網路是各平台都有,
而且在UNIX、Linux的環境,他是很基本又常見的溝通機制,
也因為這樣,取名為Universal Network Objects。

簡單的說,它跟Java的物件導向概念雷同,它們的類比如下:
UNO ServiceJava Class
UNO PropertiesJava Object Properties
UNO MethodJava Object Method

簡單的說,它是以Java的物件導向為基本概念,
所有的Java Class在UNO上,都稱為Service
每個Service都有自己的Properties和Method

要使用Service,則和使用Java Object有些許不同,類比如下:
UNO:
Dim oDesk as Object
oDesk = createUnoService ("com.sun.star.frame.Desktop")


Java:
Object oDesk;
oDesk = new com.sun.star.frame.Desktop();


這樣應該很清楚,差異在於,要定義物件時,使用
Dim <名稱> as <物件名稱>

要實體化時(UNO下應該說是建立Service),使用
<名稱> = createUnoService("com.sun.star.frame.Desktop")

這樣描述,應該就能清楚的瞭解UNO的Service概念,
而要使用UNO Service也很容易,同樣以上面的oDesk為例子,
可以如下使用:
Dim oDoc as Object
oDoc = oDesk.loadComponentFromUrl("private:factory/scalc", "_blank",0,Array ())


在這裡,loadComponentFromUrl()就是com.sun.star.frame.DesktopMethod
使用上和Java的語法差不多。

要定義或修改Properties也很容易,類似如下:
oCell.String = "我的第一個Input"

這樣就能修改oCellString這個Property
並將內容改為"我的第一個Input"



最後,同樣出個簡單的問題,答案很好找,
卻在使用時頭一個會遇到疑問。
在Java中,每個Object幾乎都有相對應的Object名稱,
例如:
JFrame f = new javax.swing.JFrame();

像是JFrame f裡面的JFrame。

那類比到UNO Service時,這個建立後的Service,
是否也有獨立的名稱?
如果有,那會是甚麼?
如果沒有,那又會是甚麼?

補充:
漏了一個部份.....
我們回到前面常見的UNO概念圖,圖上在Service的外圍,
有一個ModuleService包裹住,Module是甚麼?
這也是很簡單的概念,同樣取自Java,類比如下:
UNO ModuleJava Package

實際上,和Java的Class一樣,OpenOffice的Service根據不同的用途,
會被包裹在不同的Module裡面,例如:
javax.swing.JFrame

我們可以知道JFrame屬於javax.swing這個Package,同樣的,在UNO中
com.sun.star.frame.Desktop

Desktop就是屬於com.sun.star.frame這個Package

1 則留言:

呂卓青(Lu Cho-Chin) 提到...

謝謝你寫得UNO說明

我也正在玩OOo Macro
這對我這種菜鳥幫助很大~

3Q!