- サマリ: OLEObjectのファイルからの挿入方法
- 環境: Calc
- 状態: 解決
- 投稿者: Bebup?
- 投稿日: 2011-10-26 (水) 09:43:52
質問 
OpenOffice.org3.2.1で開発を行っております。
OLE Objectの挿入を OOoBasic/Calc/OLEObj を参考にして
下記の様に作成しましたが、下記の oEmbDoc を 外部.odsファイルより
loadする事はできますでしょうか。尚、LinkURL は試しましたが、
この方法はその名の通り、外部リンクとなってしまいます。下記のごとく
埋め込み型でリンクしたいと思っております。.odsファイルをloadして
全てのSheetをコピーする方法しか無いのでしょうか。
Sub Main
Dim oDoc As Object
Dim oDrawPage As Object
Dim oEmbCalc As Object
Dim oEmbDoc As Object
Dim aPosition As New com.sun.star.awt.Point
Dim aSize As New com.sun.star.awt.Size
oDoc = ThisComponent
oDrawPage = oDoc.getDrawPages().getByIndex(0)
oEmbCalc = oDoc.createInstance("com.sun.star.drawing.OLE2Shape")
oDrawPage.add(oEmbCalc)
aPosition.X = 100
aPosition.Y = 100
aSize.Width = 10000
aSize.Height = 4000
oEmbCalc.setPosition(aPosition)
oEmbCalc.setSize(aSize)
oEmbCalc.CLSID = "47bbb4cb-ce4c-4e80-a591-42d9ae74950f"
oEmbDoc = oEmbCalc.Model
'SpreadSheet内容設定
End Sub
回答 
- アクセシビリティ API を使ったり、こっそり埋め込んだり・・・。
アクセシビリティ API では以下のような感じで行います。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| | Dim oListener As Variant
Dim oContWin As Variant
Dim sURL As String
Sub Main
sURL = "file:///home/user/Desktop/data.ods"
oDoc = ThisComponent
oFrame = oDoc.getCurrentController().getFrame()
oContWin = oFrame.getContainerWindow()
oListener = CreateUnoListener(_
"TopWindow_", "com.sun.star.awt.XTopWindowListener")
oContWin.getToolkit().addTopWindowListener(oListener)
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oFrame, ".uno:InsertObject", "", 0, Array())
End Sub
Sub Gonyagonya(oWin)
Roles = com.sun.star.accessibility.AccessibleRole
oAcc = oWin.getAccessibleContext()
oAccRadio = FindAccChild(oAcc, Roles.RADIO_BUTTON, "Create from file")
oAccRadio.setCurrentValue(1)
oAccEdit = FindAccChild(oAcc, Roles.TEXT, "")
oAccEdit.setText(sURL)
oAccButton = FindAccChild(oAcc, Roles.PUSH_BUTTON, "OK")
oAccButton.doAccessibleAction(0)
End Sub
Function TopWindow_disposing(ev)
End Function
Function TopWindow_windowOpened(ev)
oContWin.getToolkit().removeTopWindowListener(oListener)
Gonyagonya(ev.Source)
End Function
Function TopWindow_windowClosing(ev)
End Function
Function TopWindow_windowClosed(ev)
End Function
Function TopWindow_windowMinimized(ev)
End Function
Function TopWindow_windowNormalized(ev)
End Function
Function TopWindow_windowActivated(ev)
End Function
Function TopWindow_windowDeactivated(ev)
End Function
Function FindAccChild(oParent, nRole, sName)
Dim oFound
For i=0 to oParent.getAccessibleChildCount() -1 step 1
oChild = oParent.getAccessibleChild(i)
If HasUnoInterfaces(oChild, "com.sun.star.accessibility.XAccessible") Then
oAcc = oChild.getAccessibleContext()
If HasUnoInterfaces(oAcc, "com.sun.star.accessibility.XAccessibleComponent") Then
If oAcc.getAccessibleRole() = nRole AND oAcc.getAccessibleName() = sName Then
oFound = oAcc
Exit For
End If
End If
End If
Next
FindAccChild = oFound
End Function
|
- Calc のドキュメントを Calc 以外のドキュメントに挿入するのであれば、次のような方法もあります。Python で書いてありますが・・・。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| | import unohelper
import uno
from com.sun.star.datatransfer import XTransferable, DataFlavor
class Trans(unohelper.Base, XTransferable):
def __init__(self, ctx, url):
self.ctx = ctx
self.url = url
def getTransferData(self, flavor):
print("getdata")
#print(flavor)
if flavor.MimeType.startswith("application/x-openoffice-embed-source-xml"):
try:
sfa = self.ctx.getServiceManager().createInstanceWithContext(
"com.sun.star.ucb.SimpleFileAccess", self.ctx)
io = sfa.openFileRead(self.url)
d, bytes = io.readBytes(None, 32000)
return bytes
except Exception as e:
print(e)
return ""
def getTransferDataFlavors(self):
print("get")
mime = "application/x-openoffice-objectdescriptor-xml;" + \
"windows_formatname=\"Star Object Descriptor (XML)\";" + \
"classname=\"47BBB4CB-CE4C-4E80-a591-42d9ae74950f\";" + \
"typename=\"calc8\";" + \
"displayname=\"" + self.url + "\";" + \
"viewaspect=\"1\";width=\"18066\";height=\"6379\";posx=\"0\";posy=\"0\""
mime2 = "application/x-openoffice-embed-source-xml;" + \
"windows_formatname=\"Star Embed Source (XML)\""
f1 = DataFlavor(mime, "", uno.getTypeByName("[]byte"))
f2 = DataFlavor(mime2, "", uno.getTypeByName("string"))
return (f1, f2)
def isDataFlavorSupported(self, flavor):
return True
def try_to_paste(*args):
url = "file:///home/asuka/Desktop/data.ods"
ctx = XSCRIPTCONTEXT.getComponentContext()
doc = XSCRIPTCONTEXT.getDocument()
controller = doc.getCurrentController()#.getFrame()
controller.insertTransferable(Trans(ctx, url))
|
どちらかというと裏技なので詳しく説明しません。ヒントは OOoBasic/Generic/XTransferable。
感想,コメント,メモ 
- はにゃさん 早速のご返答有難うございます -- BeBup 2011-10-26 (水) 14:09:35;
- ご教示頂いた方法は Window操作のAutomation方法だと思いますが、
この方法はリスナー、アクセシビリティ等の方法が入り、私にとっては
かなり難解となりますので、前述しました全シートのコピーの方法で
模索したいと思います。ただしこの様な方法も今後研究したいと思います。
今回は、ひとまずこの時点で解決とさせていただきます。
- はにゃさん 再度のご返答有難うございます。 -- BeBup
- このサイトの OOoBasic/Calc/Sheet/シートリンク
よりヒントを得て全シートのコピーの方法で解決しました。
途中、EmbeddedCalcのCurrentControllerの取得で手間取りましたが、
XModel.setCurrentControllerの方法で解決しました。
目標達成と思いきや、今度はOLE2Shapeの外枠線(BorderLine)の
追加方法で悪戦苦闘中です。
また、お世話になるかも知れませんが宜しくお願いします。
- OLE 系の図形には外枠は設定できませんよ・・・。無理に枠線を引きたければ、図形描写オブジェクトを下に配置するなどの方法が必要です。 -- はにゃ?
- Excelもそのとうりでした。 -- BeBup