1

如何从 .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
}

更新

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

4

1 回答 1

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 文档开始,然后转到Insert -> Field -> More Fields。在函数选项卡下,双击输入字段。在文本框区域输入“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 的宏文档5.18 节用户字段

于 2020-06-22T17:04:18.313 回答