gpt4 book ai didi

java - 在 Java 中嵌入 Office

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:18 24 4
gpt4 key购买 nike

我正在尝试使用 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):

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)

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



更新:

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

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

最佳答案

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

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

关于java - 在 Java 中嵌入 Office,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3278552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com