Libreoffice API (UNO) : 来自 xTextField 的文本和数据
Libreoffice API (UNO) : text and data from xTextField
如何正确地从 .odt 文档中获取 xTextFields?
我试过类似的东西,但它不起作用(任何 returns 一个 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:
我得到了一个对我有帮助的解决方案:
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 文档开始,然后转到 插入 -> 字段 -> 更多字段。在 函数 选项卡下,双击 输入字段 。在文本框区域输入“你好”,按确定。
然后,运行下面的代码。
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 用户字段。
如何正确地从 .odt 文档中获取 xTextFields?
我试过类似的东西,但它不起作用(任何 returns 一个 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:
我得到了一个对我有帮助的解决方案:
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 文档开始,然后转到 插入 -> 字段 -> 更多字段。在 函数 选项卡下,双击 输入字段 。在文本框区域输入“你好”,按确定。
然后,运行下面的代码。
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 用户字段。