LibreOffice Calc Basic - ドキュメントを保存する方法

◆com.sun.star.frame.XStorable インターフェース

LibreOffice ドキュメントの保存処理は、ドキュメントオブジェクトを通じて直接実行されます。このような処理をBasicで行うには、com.sun.star.frame.XStorableインターフェースのstoreメソッドを、以下のような形で使用します。

ThisComponent.store()

このメソッドは、ドキュメントへのメモリ割り当てが既に終了している場合のみ機能します。ただしこの条件は、新規ドキュメントの場合には該当しません。そのような場合にはstoreAsURLを使用します。このメソッドはcom.sun.star.frame.SXtorableにも用意されており、以下のようにドキュメントの保存位置を指定する際に使用できます。

Dim URL As String
Dim Dummy()

Url="file:///C:/test1.ods"

ThisComponent.storeAsURL(URL,Dummy())

これらのメソッドの他にcom.sunstar.frame.XStorableには、ドキュメントの保存に関するいくつかのサポート用メソッドが用意されています。これに該当するのが、以下のメソッドです。

  • hasLocation() - ドキュメントのURL指定が完了しているかを確認します。
  • isReadOnly() - ドキュメントが読み取り専用であるかを確認します。
  • isModified() - 前回保存時からドキュメントが変更されているかを確認します。

 ドキュメント保存用のプログラムコードを構築する際には、これらのオプションを利用することで、変更箇所があるドキュメントのみ保存処理を進めたり、名前が指定されていない場合のみファイル名の指定を要求するなどの機能を組み込むことができます。

Sub DocSave
    dim oDoc as object
    oDoc=ThisComponent
    
    If (oDoc.isModified) Then
        If (oDoc.hasLocation And (Not oDoc.isReadOnly)) Then
            oDoc.store()
        Else
            oDoc.storeAsURL(URL, Dummy())
        End If
    End If
End Sub

上記のサンプルコードでは、まず最初に、前回保存時からドキュメントが変更されているかを確認しています。そして変更箇所がある場合のみ、残りの保存処理を継続します。次に、ドキュメントのURL 指定の有無と、読み取り専用でないことを確認し、双方の条件を満たしている場合のみ、既存の URL に対してドキュメントを保存します。URL 指定が完了していない場合、あるいは読み取り専用で開かれている場合は、URL を新規指定して保存する処理を行います。

◆保存の確認を行う場合
 ユーザーに確認する場合は、以下のようなコードになります。
 このサンプルコードでは、ユーザーが[はい]をクリックすると、文書を保存し、ドキュメントオブジェクトのCloseメソッドで文書を閉じています。

Sub DocSaveClose
    
    Dim ret%
    dim oDoc as object
        
    oDoc=ThisComponent
    
    If oDoc.isModified Then
        if (oDoc.hasLocation And (Not oDoc.isReadOnly)) then
            ret = MsgBox( "このドキュメントを保存しますか?",3 + 32 ,"保存の確認")
                If ret=6 then    rem[はい]
                      oDoc.store() 
                      oDoc.close(True)  
                elseIf ret%=7 then    rem[いいえ]
                    oDoc.close(True)
                    exit sub           
                End If
        end If
    else
        oDoc.close(True)
    End if
End Sub

◆マクロ記録
 マクロの記録機能で作成されたコードは以下の通りです。

dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())


▼ページトップへ