Java と SWT を使用して Microsoft Word の自動化をプログラムすることに成功しました。ここで、Open Office / Libre Office ライターに対しても同じことを行う必要があります。
MS Word の場合、次のような Word.Application を使用しました。
...
wordSite = new OleClientSite(frame, SWT.NONE, "Word.Application");
wordAutomation = new OleAutomation(wordSite);
...
wordautomation.getIDsOfNames ....
これは、Open Office と同様の方法で行う必要があると思います。どのオブジェクトを使用すればよいですか? そしてどうやって?ありがとうございました
EDIT1: 私は長い質問を作成することを避けようとしましたが、私の質問は反対票を投じられたので、より詳細に説明しようとします:
- 私の長期的なニーズは、Java アプレットを介してオープン オフィス ドキュメントを開いて自動化することです。
- UNO と Office Bean を試しましたが、私の場合 (パスと環境設定の依存関係) はどちらも役に立たないようで、Web ブラウザーから何かを起動するときに受け入れられません。
- 以前に Microsoft Word を使用した経験があるため、オブジェクトを求めました。Word.Document を使用すると、ドキュメントを開くことができましたが、自動化は機能しませんでした。Word.Application を介してドキュメントを開くと、自動化は機能しましたが、私が好きで使用したい ole オブジェクトのようには動作しませんでした。
現在、私のコード (以下) では自動化機能を使用できません。Word.Document のように機能します。
OODocument(String systemName, String fileName) {
this.fileName = fileName;
display = new Display();
shell = new Shell(display);
shell.setSize(1000, 700);
shell.setLayout(new FillLayout());
oleFrame = new OleFrame(shell, SWT.NONE);
oleClientSite = new OleClientSite(oleFrame, SWT.NONE, new File(fileName));
oleClientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
addMenu(oleFrame, systemName);
shell.open();
OleAutomation oleDocument = new OleAutomation(oleClientSite);
infoLabel.setVisible(false);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
oleDocument.dispose();
display.dispose();
}
それが、「どのオブジェクトを使用するか」という質問をした方法です。Word.Application に似たオブジェクトを探しています。com.sun.star.frame.Desktop でしょうか。もしそうなら、私はまだそれを使用することに成功していません.
過去に OLe を介して OOO アクセスをプログラムし、いくつかのアイデアやコードを共有できると思いました。
ありがとうございました。
EDIT 2 以下は、vbs で書かれた OpenOffice SDK のコードです。誰かがこれをJAVAとSWTに変換するのを手伝ってくれたら、それが解決策になります:
'The service manager is always the starting point
'If there is no office running then an office is started up
Set objServiceManager= WScript.CreateObject("com.sun.star.ServiceManager")
'Create the CoreReflection service that is later used to create structs
Set objCoreReflection= objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
'Create the Desktop
Set objDesktop= objServiceManager.createInstance("com.sun.star.frame.Desktop")
'Open a new empty writer document
Dim args()
Set objDocument= objDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, args)
'Create a text object
Set objText= objDocument.getText
'Create a cursor object
Set objCursor= objText.createTextCursor
'Inserting some Text
objText.insertString objCursor, "The first line in the newly created text document." & vbLf, false
'Inserting a second line
objText.insertString objCursor, "Now we're in the second line", false
'Create instance of a text table with 4 columns and 4 rows
Set objTable= objDocument.createInstance( "com.sun.star.text.TextTable")
objTable.initialize 4, 4
'Insert the table
objText.insertTextContent objCursor, objTable, false
'Get first row
Set objRows= objTable.getRows
Set objRow= objRows.getByIndex( 0)
'Set the table background color
objTable.setPropertyValue "BackTransparent", false
objTable.setPropertyValue "BackColor", 13421823
'Set a different background color for the first row
objRow.setPropertyValue "BackTransparent", false
objRow.setPropertyValue "BackColor", 6710932
'Fill the first table row
insertIntoCell "A1","FirstColumn", objTable
insertIntoCell "B1","SecondColumn", objTable
insertIntoCell "C1","ThirdColumn", objTable
insertIntoCell "D1","SUM", objTable
objTable.getCellByName("A2").setValue 22.5
objTable.getCellByName("B2").setValue 5615.3
objTable.getCellByName("C2").setValue -2315.7
objTable.getCellByName("D2").setFormula"sum <A2:C2>"
objTable.getCellByName("A3").setValue 21.5
objTable.getCellByName("B3").setValue 615.3
objTable.getCellByName("C3").setValue -315.7
objTable.getCellByName("D3").setFormula "sum <A3:C3>"
objTable.getCellByName("A4").setValue 121.5
objTable.getCellByName("B4").setValue -615.3
objTable.getCellByName("C4").setValue 415.7
objTable.getCellByName("D4").setFormula "sum <A4:C4>"
'Change the CharColor and add a Shadow
objCursor.setPropertyValue "CharColor", 255
objCursor.setPropertyValue "CharShadowed", true
'Create a paragraph break
'The second argument is a com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
objText.insertControlCharacter objCursor, 0 , false
'Inserting colored Text.
objText.insertString objCursor, " This is a colored Text - blue with shadow" & vbLf, false
'Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK).
objText.insertControlCharacter objCursor, 0, false
'Create a TextFrame.
Set objTextFrame= objDocument.createInstance("com.sun.star.text.TextFrame")
'Create a Size struct.
Set objSize= createStruct("com.sun.star.awt.Size")
objSize.Width= 15000
objSize.Height= 400
objTextFrame.setSize( objSize)
' TextContentAnchorType.AS_CHARACTER = 1
objTextFrame.setPropertyValue "AnchorType", 1
'insert the frame
objText.insertTextContent objCursor, objTextFrame, false
'Get the text object of the frame
Set objFrameText= objTextFrame.getText
'Create a cursor object
Set objFrameTextCursor= objFrameText.createTextCursor
'Inserting some Text
objFrameText.insertString objFrameTextCursor, "The first line in the newly created text frame.", _
false
objFrameText.insertString objFrameTextCursor, _
vbLf & "With this second line the height of the frame raises.", false
'Create a paragraph break
'The second argument is a com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
objFrameText.insertControlCharacter objCursor, 0 , false
'Change the CharColor and add a Shadow
objCursor.setPropertyValue "CharColor", 65536
objCursor.setPropertyValue "CharShadowed", false
'Insert another string
objText.insertString objCursor, " That's all for now !!", false
On Error Resume Next
If Err Then
MsgBox "An error occurred"
End If
Sub insertIntoCell( strCellName, strText, objTable)
Set objCellText= objTable.getCellByName( strCellName)
Set objCellCursor= objCellText.createTextCursor
objCellCursor.setPropertyValue "CharColor",16777215
objCellText.insertString objCellCursor, strText, false
End Sub
Function createStruct( strTypeName)
Set classSize= objCoreReflection.forName( strTypeName)
Dim aStruct
classSize.createObject aStruct
Set createStruct= aStruct
End Function
上記のコードは、.vbs ファイルに保存され、次のように開始されます。 cscript WriterDemo.vbs は Open Office ライターを起動し、一部のデータがドキュメントに書き込まれます。ただし、Javaで動作させることはできません。
そのようにこれを開始しようとすると:
final String PROG_ID = "com.sun.star.ServiceManager";
display = new Display();
shell = new Shell(display);
frame = new OleFrame(shell, SWT.NONE);
writterSite = new OleControlSite(frame, SWT.NONE, PROG_ID);
writterAutomation = new OleAutomation(writterSite);
その後、例外が発生します
Caught: org.eclipse.swt.SWTException
Failed to create Ole Client. result = -2147221164
org.eclipse.swt.SWTException: Failed to create Ole Client. result = -2147221164
at org.eclipse.swt.ole.win32.OLE.error(Unknown Source)
at org.eclipse.swt.ole.win32.OleControlSite.<init>(Unknown Source)
at office.WritterAutomation.<init>(WritterAutomation.java:39)
at office.WritterAutomation.main(WritterAutomation.java:454)
間違ったオブジェクトを使用しようとしているか、不適切に使用していると思います。ご協力いただきありがとうございます。