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 库过程