在Java中嵌入Office

Luk*_*ane 10 java embed swt ms-office

我正在尝试使用以下代码使用SWT将Office 2007/2010应用程序嵌入Java应用程序中:

import java.awt.Canvas;
import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;

public class EmbeddingTest extends Canvas {
    private void initOleViewer(String target) {
        Display display = new Display();
        Shell shell = SWT_AWT.new_Shell(display, this);
        shell.setLayout(new FillLayout());

        OleFrame oleFrame = new OleFrame(shell, SWT.NONE);

        OleControlSite oleControlSite = new OleControlSite(oleFrame, SWT.NONE, "Word.Document");
        oleControlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);

        OleAutomation word = new OleAutomation(oleControlSite);

        int[] applicationId = word.getIDsOfNames(new String[]{"Application"});
        Variant property = word.getProperty(applicationId[0]);
        OleAutomation application = property.getAutomation();

        int[] documentId = application.getIDsOfNames(new String[]{"Documents"});            
        property = application.getProperty(documentId[0]);
        OleAutomation documents = property.getAutomation();

        shell.open();
        Variant[] arguments = new Variant[] { new Variant(target) };
        int[] automationIDs = documents.getIDsOfNames(new String[]{"Open", "FileName"});
        documents.invokeNoReply(automationIDs[0], arguments, new int[]{automationIDs[1]});

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame("Embedding Test");
        jFrame.setVisible(true);

        EmbeddingTest viewer = new EmbeddingTest();
        jFrame.add(viewer);
        jFrame.setSize(600, 600);

        viewer.initOleViewer(args[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我不尝试在文档对象上调用"打开"时,Word在应用程序中成功嵌入,但整个文件菜单被禁用.当我调用'打开'时,应用程序崩溃并出现以下错误(DISP_E_EXCEPTION):

Exception in thread "main" org.eclipse.swt.SWTException: Action can not be performed. result = -2147352567
 at org.eclipse.swt.ole.win32.OLE.error(Unknown Source)
 at org.eclipse.swt.ole.win32.OleAutomation.invokeNoReply(Unknown Source)
 at EmbeddingTest.initOleViewer(EmbeddingTest.java:68)
 at EmbeddingTest.main(EmbeddingTest.java:88)
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题或者在Java中嵌入Office应用程序的替代解决方案?谢谢!



更新:

分别查询'Open'和'FileName'的ID会为'FileName'返回null,因此它不正确.我也试过没有命名参数没有任何成功:

documents.invokeNoReply(automationIDs[0], arguments);
Run Code Online (Sandbox Code Playgroud)

Gun*_*r47 1

为什么不进行任何错误处理、结果检查或断言?请记住,这getIDsOfNames(..)将默默地失败并返回null无法识别的名称的值。

documents.getLastError()尝试在捕获有问题的异常后打印 的值。