微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java中嵌入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]);
    }
}

当我不尝试在文档对象上调用“打开”Word在应用程序内成功嵌入,但是整个文件菜单被禁用.当我打“打开”应用程序崩溃与以下错误(disP_E_EXCEPTION):

06001

有没有人知道如何解决这个问题或一个替代解决方案来嵌入Office应用程序在Java?谢谢!

更新:

单独查询“打开”和“文件名”的ID为’FileName’返回null,因此它的值不正确.我也尝试没有命名参数没有任何成功:

documents.invokenoreply(automationIDs[0],arguments);

解决方法

你为什么不做任何错误处理,结果检查或断言?请记住,getIDsOfNames(..)将认失败并返回空值,以供无法识别的名称.

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

原文地址:https://www.jb51.cc/java/126433.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐