よろずやネット

最近はLibreofficeにハマっています。

オープンオフィスへのアプローチとその開放

私の開発環境は以下の通りだ。
.Net Framework 2.0 と SharpDevelop 2.2.1 (Visual Basic .Net) と OpenOffice 2.3
なお、私はシロウトなので、これ以降の記述には、邪道な方法、用語用法の間違い等が多々含まれていると思う。間違いは遠慮なくご指摘いただきたい。

オープンオフィスのソフトウエア開発キット(SDK)は、http://www.openoffice.org/dev_docs/source/sdk/ からダウンロードできるようだ。
このSDKはオープンオフィスそのものを開発するためのキットであり、私にはあまり関係がない。

このブログで私が参考にしている主なサイトは、下記の通り。
http://api.openoffice.org/TipsAndTricks/external.html
http://www.oooforum.org/
(Oooフォーラム)

上記サイトによると、オープンオフィスは、COMオブジェクトのようにアプローチできるとのこと。
しかし、オープンオフィスはタイプライブラリを提供していないので、Visual Basic .Netのプログラマーから見えないし、編集時にメソッドやプロパティの自動入力補助も表示されない、という。
つまり、実行時にしかエラーがわからないということでもある。

Visual Basic .Netからオープンオフィスにアプローチするには、常に次の手順をふむ。
(1)サービスマネージャというオブジェクトをつくる。
(2)サービスマネージャーでUniversal Network Objects (UNO) と呼ばれるインターフェースにアプローチする。
(3)その後、UNOのいろいろなサービスを使ってオープンオフィスにアプローチする。
という感じだ。

------コード例--------
(1)サービスマネージャを作成
Public oSM As Object
oSM = CreateObject("com.sun.star.ServiceManager")

(2)UNOの例(デスクトップを作成)
Public oDesktop As Object
oDesktop = oSM.createInstance("com.sun.star.frame.Desktop")

下記リンクはデスクトップの解説。
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Desktop_Environment

サービスマネージャとUNOサービスの立ち上げは常につきまとうので、この際、一連の手続きをまとめてみよう。
------コード例--------
Public oSM As Object
Public oDesktop As Object
Public oDispHelper As Object
REM DesktopとDispatchHelperなどよく使うサービスは、使う使わないは別として、Publicで事前に定義しておいたら便利。

Sub ConnectOOo()
    Try
      oSM = CreateObject("com.sun.star.ServiceManager")
    Catch
      oSM = Nothing
    End Try
    If (isNothing(oSM) Or IsDBNull(oSM)) Then
      Msgbox("Error")
    Else
      oDesktop = CreateUnoService("com.sun.star.frame.Desktop")
      oDispHelper = CreateUnoService("com.sun.star.frame.DispatchHelper")
    End If
End Sub

Function CreateUnoService(ByVal serviceName As String) As Object
    Dim Temp As Object
    Temp = oSM.createInstance(serviceName)
    If (isNothing(Temp) Or IsDBNull(Temp)) Then
      Msgbox("Error")
    End If
    CreateUnoService = Temp
End Function

Sub DisconnectOpenOffice()
    oDispHelper = Nothing
    oDesktop = Nothing
    oSM = Nothing

    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()

    'GC(garbage collection)については、 http://www.xtremevbtalk.com/showthread.php?t=160433

End Sub