OOobbs2/106
質問
異なるドキュメント間のセル範囲コピーについて、下記のようなものを組んでみました。 Sub tetugin28(B,C,D,E,F) rem ドキュメント間のコピー dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") sframe = ThisComponent.CurrentController.Frame JunpTo(B,C) dispatcher.executeDispatch(sframe, ".uno:Copy", "", 0, Array()) ddoc = StarDesktop.loadComponentFromURL(D,"_hidden", 0, Array()) rem ←疑問2 第2引数、"_hidden" dframe = ThisComponent.CurrentController.Frame hanicount(E,F) dispatcher.executeDispatch(dframe, ".uno:Paste", "", 0, Array()) ddoc.storeAsURL(D,Array()) ddoc.close(imifumei) rem ←疑問1 closeメソッドの引数 sframe.getContainerWindow().toFront() end sub sub hanicount(A,B) rem シートと列を指定して最終行へ移動(シート名ByName,列ByName) cont = ThisComponent.getCurrentController() hani = ThisComponent.getSheets().getByName(A).getCellRangeByName(B+"1:"+B+"1000") ichi = B+(hani.computeFunction(com.sun.star.sheet.GeneralFunction.COUNT)+1) cont.select(ThisComponent.getSheets().getByName(A).getCellRangeByName(ichi) end sub Sub JunpTo(A,B) rem シートと範囲を指定して移動(シート名ByName・セル範囲ByName) cont = ThisComponent.getCurrentController() cont.select(ThisComponent.getSheets().getByName(A).getCellRangeByName(B)) End Sub call tetugin28("表1","B3:J3","file:///E:/test2.ods","表1","C") 回答
その前に、疑問点から。
OwnerShip をどうするか、という問題ですがフレームオブジェクトおよびドキュメントモデル自体が Owner なので Basic でしていしても問題点がない場合には挙動は同じようになるんだと思います。(True にする必要がある状況があったような気がするけど、あれは dispose の話だったか…な(?)。) 「変更を保存しますか」といったダイアログが出ないのは、
DevGuide Closing Documents 上記のインターフェースを利用する場合には次のような感じにします。 oDoc = ThisComponent If oDoc.isModified() Then If oDoc.hasLocation() Then oDoc.store() Else oDoc.storeAsURL("file:///home/......", Array()) End If End If Hidden モードで開いていないドキュメントであればコマンドでドキュメントを閉じればダイアログが表示されます。.uno:CloseDoc を利用します。(dispatch helper を利用したほうが記述が楽です。 oController = ThisComponent.getCurrentController() aURL = CreateUnoStruct("com.sun.star.util.URL") aURL.Complete = ".uno:CloseDoc" CreateUnoService("com.sun.star.util.URLTransformer")._ parseStrict(aURL) oDisp = oController.queryDispatch(aURL,"_self",0) If NOT IsNull(oDisp) Then oDisp.dispatch(aURL,Array()) End If
利用可能なフレーム名は、普通のフレーム名以外に次のものがあります。
_hidden は IDL ガイドに記載がありませんが、ドキュメントを非表示状態で開くには loadComponentFromURL メソッドの最後の引数に MediaDescriptor Dim aArgs(0) As New com.sun.star.beans.PropertyValue aArgs(0).Name = "Hidden" aArgs(0).Value = True StarDesktop.loadComponentFromURL("private:factory/scalc","_blank",0, aArgs)
コントローラの com.sun.star.datatransfer.XTransferableSupplier 一方の (コピー元) ドキュメントのコントローラから getTransferable メソッドで XTransferable インターフェースを取得します。(このとき、選択範囲に相当するコンテンツが含まれていることに注意。) そして、もう一方のドキュメント (貼り付け先) のコントローラから insertTransferable メソッドで先のドキュメントから取得した XTransferable インターフェースを与えます。このメソッドは呼び出すとすぐに挿入されます。(このときも、セルカーソルのある位置に貼り付けられることに注意。) Sub Copy_Transferable_1 oDoc = ThisComponent oController = oDoc.getCurrentController() ' コピーする範囲を選択 oController.select( _ oDoc.getSheets().getByIndex(0).getCellRangeByPosition(0,0,1,2) ) oTransferable = oController.getTransferable() Dim aArgs(0) As New com.sun.star.beans.PropertyValue aArgs(0).Name = "Hidden" aArgs(0).Value = False'True oNewDoc = StarDesktop.loadComponentFromURL( _ "private:factory/scalc", "_blank", 0, aArgs ) oNewDoc_Controller = oNewDoc.getCurrentController() ' 貼り付け先範囲を指定 oNewDoc_Controller.select( _ oNewDoc.getSheets().getByIndex(0).getCellByPosition(1,1) ) oNewDoc_Controller.insertTransferable( oTransferable ) oNewDoc.storeAsURL("file:///C:/usr/out.ods",Array()) oNewDoc.close(True) End Sub Hidden = True だとセルの選択がうまくいかないかと思っていましが、そんなことありませんでした。 シートを丸ごとコピーするのであればシートのリンクが利用できるんですけどねぇ。
Hidden = True だとセルの選択がうまくいかない・・・loadCの第4引数ですよね? Sub shon (A,B) rem シート呼出(ファイル名・シート名) s = ThisComponent.getSheets().getByIndex(6) rem シート番号固定 s.link(A,B,"","",com.sun.star.sheet.SheetLinkMode.NORMAL) s.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE) rem or NORMAL End Sub
Hidden のときにセルカーソルをあまり動かしたことがなかったもので。Copy_Transferable_1 は一応動作確認しました。そういえば、Hidden = True で開いた時にはコマンドによる処理が動作しないんじゃなかったかな、と。
因みに、前述のガイドではloadCの第4引数について次の様な記述があります AsTemplate (ブール値) – これがTrue の場合、指定URLからドキュメントを読み込み 新規の無題ドキュメントとして表示します。False の場合は、テンプレートファイルを編集モードで読み込みます。 CharacterSet (文字列) – ドキュメントで使用する文字列コードを指定します。 FilterName (文字列) – loadComponentFromURL メソッドで使用する特殊なフィルタを指定します。 指定可能なフィルタ名は ファイル\share\config\registry\instance\org\openoffice\office\TypeDetection.xml に定義されています。 FilterOptions (文字列) – フィルタの追加オプションを指定します。 JumpMark (文字列) – ドキュメントのオープン後に、JumpMark の指定位置にジャンプさせます。 Password (文字列) – パスワード保護したファイル用のパスワードを与えます。 ReadOnly (ブール値) – 読み取り専用ドキュメントとして開くかを指定します。
loadComponentFromURL メソッドの四番目の引数は MediaDescriptor MediaDescriptor はページを作ることにします。OOoBasic/Generic/MediaDescriptor JumpMark を指定するとはドキュメントのブックマークの位置を表示します。URL のアンカー部分に相当します。 aArg = CreateUnoStruct("com.sun.star.beans.PropertyValue") aArg.Name = "JumpMark" aArg.Value = "bookmark" StarDesktop.loadComponentFromURL( "file:///home/user/Doc.odt", "_blank", 0, Array( aArg ) ) 上記は次のものと同じ動作をします。 StarDesktop.loadComponentFromURL( "file:///home/user/Doc.odt#anchor", ... "#" で指定する方法は昨日、Writer のページに書いた気がします。
感想,コメント,メモ
|