使用swriter直接打开libreoffice邮件合并的textdocument

时间:2015-11-06 12:57:14

标签: openoffice.org libreoffice mailmerge office-automation

我需要帮助直接在新的编写器文档中打开邮件合并操作的结果。

    Object mailMergeService = mcf.createInstanceWithContext(mailMergePackage, context);
    XPropertySet mmProperties = UnoRuntime.queryInterface(XPropertySet.class, mailMergeService);
    mmProperties.setPropertyValue("DocumentURL", templatePath);
    mmProperties.setPropertyValue("DataSourceName", dbName);
    mmProperties.setPropertyValue("CommandType", mmCommandType);
    mmProperties.setPropertyValue("Command", mmCommand);
    mmProperties.setPropertyValue("OutputType", mmOutputType);
    // mmProperties.setPropertyValue("OutputURL", templateDirectory);
    // mmProperties.setPropertyValue("FileNamePrefix", mmFileNamePrefix);
    // mmProperties.setPropertyValue("SaveAsSingleFile", mmSaveAsSingleFile);

mmOutputType设置为MailMergeType.SHELL LibreOffice API文档说

"输出是文档shell。 成功的邮件marge返回基于XTextDocument的组件。"

所以我尝试过这样的事情

    XJob job = UnoRuntime.queryInterface(XJob.class, mailMergeService);
    Object mergedTextObject = job.execute(new NamedValue[0]);

    String url = "private:factory/swriter";
    loader.loadComponentFromURL(url, "_blank", 0, new PropertyValue[0]);

    XTextDocument mergedText = UnoRuntime.queryInterface(XTextDocument.class, mergedTextObject);
    XTextCursor cursor = mergedText.getText().createTextCursor();
    cursor.setString(mergedText.getText().getString());

我想我必须将XTextDocument组件传递给loadComponentFromURL方法的url-argument,但我没有找到正确的方法。

当我将OutputType更改为MailMergeType.FILE时,结果将在给定目录中生成,我可以打开该文件并看到邮件合并成功。但这不是我的应用程序应该做的。

有人知道如何在不将结果保存到硬盘的情况下直接在新的编写文档中打开邮件合并的结果吗?

真诚的亚瑟

2 个答案:

答案 0 :(得分:2)

嘿伙计们我找到了一种直接打开邮件合并过程结果的简单方法。

相关的片段是这些

  XJob job = UnoRuntime.queryInterface(XJob.class, mailMergeService);
  Object mergedTextObject = job.execute(new NamedValue[0]);
  XTextDocument mergedText = UnoRuntime.queryInterface(XTextDocument.class, mergedTextObject);
  mergedText.getCurrentController().getFrame().getContainerWindow().setVisible(true);

最后一行代码使窗口显示填充的邮件合并结果。

不再需要此行了

loader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new PropertyValue[0]);

该文档将作为swriter文档的新实例打开。如果要将结果保存为文件,可以执行此操作

  mergedText.getCurrentController().getFrame().getContainerWindow().setVisible(true);
  XStorable storeMM = UnoRuntime.queryInterface(XStorable.class, mergedText);
  XModel modelMM = UnoRuntime.queryInterface(XModel.class, mergedText);
  storeMM.storeAsURL(outputDirectory + outputFilename, modelMM.getArgs());

诚恳 亚瑟

答案 1 :(得分:1)

您使用的是什么版本的LO?自{LO} 4.4以来,SHELL常量一直存在,而Apache OpenOffice尚不支持它,因此它可能无法完全实现。但是this code似乎显示出有效的测试。

如果它返回XTextDocument,那么通常我会假设该组件已经打开。但是听起来你没有看到Writer窗口出现。你是否在无头模式下开始LO?如果没有,那么这个过程可能需要几秒才能显示。

Object mergedTextObject = job.execute(new NamedValue[0]);
Thread.sleep(10000);

无论如何,看起来你的代码中有错误。这两行只是简单地将文本插入其自身:

XTextCursor cursor = mergedText.getText().createTextCursor();
cursor.setString(mergedText.getText().getString());

可能你打算写这样的东西:

XTextDocument mergedText = UnoRuntime.queryInterface(XTextDocument.class, mergedTextObject);

String url = "private:factory/swriter";
XComponent xComponent = loader.loadComponentFromURL(url, "_blank", 0, new PropertyValue[0]);
XTextDocument xTextDocument = (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xComponent);
XText xText = (XText)xTextDocument.getText();
XTextRange xTextRange = xText.getEnd();
xTextRange.setString(mergedText.getText().getString());

还有一个想法:如果整个文档在表中,getString()可能只返回一个空字符串。如果是这种情况,那么您可以使用视图光标或枚举文本内容。

编辑:

要保留包括表格在内的格式,您可以执行以下操作(改编自https://blog.oio.de/2010/10/27/copy-and-paste-without-clipboard-using-openoffice-org-api/):

// Select all.
XController xMergedTextController = mergedText.getCurrentController();
XTextViewCursorSupplier supTextViewCursor =
            (XTextViewCursorSupplier) UnoRuntime.queryInterface(
                XTextViewCursorSupplier.class, xMergedTextController);
XTextViewCursor oVC = supTextViewCursor.getViewCursor();
oVC.gotoStart(False)  // This would not work if your document began with a table.
oVC.gotoEnd(True)
// Copy and paste.
XTransferableSupplier xTransferableSupplier = UnoRuntime.queryInterface(XTransferableSupplier.class, xMergedTextController);
XTransferable transferable = xTransferableSupplier.getTransferable();
XController xController = xComponent.getCurrentController();
XTransferableSupplier xTransferableSupplier_newDoc = UnoRuntime.queryInterface(XTransferableSupplier.class, xController);
xTransferableSupplier_newDoc.insertTransferable(transferable);