【问题标题】:Libreoffice API (UNO) : text and data from xTextFieldLibreoffice API (UNO):来自 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

【问题讨论】:

    标签: c++ libreoffice uno libreoffice-writer


    【解决方案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:查看编辑后的答案。如果这仍然没有帮助,那么您可能需要提出一个新问题,并附上此问题的链接。具体说明需要什么。
    • 我在 stackoverflow.com/questions/62769483/… 那里创建了一个新主题,并提出了同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2013-03-08
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多