私の開発環境は以下の通りだ。
.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