Libreoffice API (UNO):来自 xTextField 的文本和数据

Posted

技术标签:

【中文标题】Libreoffice API (UNO):来自 xTextField 的文本和数据【英文标题】:Libreoffice API (UNO) : text and data from xTextField 【发布时间】:2020-06-22 07:29:58 【问题描述】:

如何正确地从 .odt 文档中获取 xTextFields?

我尝试了类似的方法,但它不起作用(任何返回 nullptr 地址):

Reference <XTextFieldsSupplier> xTextFieldsSupplier (xTextDoc, UNO_QUERY);
if (!xTextFieldsSupplier.is())
    return  ;

Reference<XNameAccess> xTextFieldsInfo = xTextFieldsSupplier->getTextFieldMasters();
if (!xTextFieldsInfo.is())
    return  ;

Sequence<OUString> xTextFieldsNames = xTextFieldsInfo->getElementNames();

Any any;
for (::rtl::OUString* field = xTextFieldsNames.begin();
        field != xTextFieldsNames.end();
        field++) 
    std::stringstream field_string;
    field_string << *field;
    QString fieldName = QString::fromStdString(field_string.str());
    any = xTextFieldsInfo->getByName(*field);

    Reference< XTextField > xField(any, UNO_QUERY);

    // other code to work with xField

UPD

我得到了一个对我有帮助的解决方案: Libreoffice API (UNO): need to change user's xTextField text

【问题讨论】:

【参考方案1】:

XTextFieldsSupplier 有两种方法,看来你选错了。获取文本字段的方法是getTextFields()

示例代码:

Reference< XEnumerationAccess > xFieldsEnumAccess = xTextFieldsSupplier->getTextFields();
Reference< XEnumeration > xFieldsEnum = xFieldsEnumAccess->createEnumeration();
Reference< XTextRange > xTextRange;
while ( xFieldsEnum->hasMoreElements() )

    Any aNextElement = xFieldsEnum->nextElement();
    Reference< XTextField > xField(aNextElement, UNO_QUERY);
    OUString presentation = xField->getPresentation(true);
    xTextRange = xText->getEnd();
    xTextRange->setString(presentation + OUString::createFromAscii("\n"));

如果您想处理文本字段母版,那么您的代码大部分是正确的。

Any aFieldMaster;
aFieldMaster = xNamedFieldMasters->getByName(*field);

编辑

这就是xText 的来源。

Reference < XTextDocument > xTextDocument (xComponent,UNO_QUERY);
Reference< XText > xText = xTextDocument->getText();

编辑 2

以下是更改文本字段的示例。从一个新的 Writer 文档开始,然后转到 插入 -> 字段 -> 更多字段。在 Functions 选项卡下,双击 Input Field。在文本框区域输入“hello”,然后按 OK。

然后,运行以下代码。

Reference< XServiceInfo > xInfo (xField, UNO_QUERY);
OUString sContent;
if (xInfo->supportsService("com.sun.star.text.TextField.Input"))

    Reference< XPropertySet > xProps (xField, UNO_QUERY);
    Any aContent = xProps->getPropertyValue(OUString::createFromAscii("Content"));
    aContent >>= sContent;
    sContent += OUString::createFromAscii(" there");
    aContent <<= sContent;
    xProps->setPropertyValue(OUString::createFromAscii("Content"), aContent);
    Reference< XRefreshable > xRefreshable (xFieldsEnumAccess, UNO_QUERY);
    xRefreshable->refresh();

现在,该字段包含“你好”。

有关更多信息,请查看Andrew's Macro Document 部分5.18 用户字段

【讨论】:

似乎是对的,谢谢。但是 xText 变量代表什么?你从哪里得到的? 我仍然不明白如何更改 xTextField 中的文本。有什么办法吗? @dkezling:查看编辑后的答案。如果这仍然没有帮助,那么您可能需要提出一个新问题,并附上此问题的链接。具体说明需要什么。 我在 ***.com/questions/62769483/… 那里创建了一个新主题,并提出了同样的问题

以上是关于Libreoffice API (UNO):来自 xTextField 的文本和数据的主要内容,如果未能解决你的问题,请参考以下文章

Libreoffice API (UNO):需要更改用户的 xTextField 文本

LibreOffice UNO:设置样式(可以使用 Java、VB、Python、C++、任何使用 UNO API 的语言提供)

LibreOffice API/UNO:如何在编写器的表格单元格中水平右对齐文本

如果超过最大允许时间,如何取消将 ms office 文件转换为 PDF 的 Libreoffice UNO API 库过程

Bootstrap Uno LibreOffice 异常

Python libreoffice 使用 uno 设置边距值、最佳高度和打印文档