如何检索Input字段的值并使用它来修改LibreOffice Basic宏中的占位符?

时间:2015-07-23 18:24:43

标签: macros libreoffice libreoffice-basic

我花了两天时间在这上面,我仍然无法弄清楚8 - )

我有一个LibreOffice Writer文档,其中包含一些PlaceholdersInsert -> Fields -> More Fields -> Functions -> Placeholder - > Image)和Input fieldsInsert -> Fields -> More Fieds -> Functions -> Input field),我需要检索Input field的值,并使用它来替换同一文档中的指定Placeholder

更准确。我输入Input field,例如123 并且文档中的某个位置是一个触发宏的按钮,该宏应该:

  1. 检索指定的(名为?)Input field的当前值(" 123"),
  2. "替换"一个指定的(名为?)Placeholder,其中的图片是从http://domain.tld/image/123.png
  3. 加载的

    这有可能吗?会很棒,因为我试图将外部生成的条形码插入到我的文档中......

1 个答案:

答案 0 :(得分:2)

这些都是"文本字段",一些信息和宏示例在Andrew Pitonyak的书中,OpenOffice Macros Explained(可从http://www.pitonyak.org/oo.php免费下载pdf)。 wiki page也有一些很好的背景。

表单控件(来自工具栏"表单控件")被命名,因此它们在处理宏时具有优势。然而,文本字段 - 您在文档中的类型 - 没有命名,因此您必须遍历文档中的所有字段,或突出显示特定的文本行并循环显示突出显示区域内的字段以查找文本字段你在追求。 Pitonyak文档中包含两种方法的示例。

假设文档只有一个输入字段,则此StarBasic代码将打印其当前值:

Sub DisplayFields

Dim oEnum As Object
Dim oField As Object

oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
    oField = oEnum.nextElement()
    If oField.getPresentation(True) = "Input field" Then
        Print "Input field contents: " & oField.getPresentation(False)
        Exit Do
    End If
Loop

End Sub

据我所知,没有API用其指定的内容替换占位符。调度员可能有办法 - list of dispatch commands诱人地包括" FieldDialog" - 但我无法找到任何文档或示例。

我认为您必须做的是找到字段,将光标放在那里,插入图像,然后删除占位符字段。一些StarBasic代码(再次,假设文档中只有一个占位符字段):

Sub InsertImage

Dim oEnum As Object
Dim oField As Object
Dim oAnchor As Object
Dim oText As Object
Dim oCursor As Object
Dim FileName As String
Dim FileURL As String
Dim objTextGraphicObject As Object

oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
    oField = oEnum.nextElement()
    If oField.getPresentation(True) = "Placeholder" Then
        oAnchor = oField.Anchor
        oText = oAnchor.getText()
        oCursor = oText.createTextCursorByRange(oAnchor.getEnd)

        FileName = "C:\after zoo.JPG"
        FileURL = convertToURL(FileName)
        objTextGraphicObject = ThisComponent.createInstance("com.sun.star.text.TextGraphicObject") 

        REM Optional to set the size
'       Dim objSize as New com.sun.star.awt.Size
'       objSize.Width = 3530
'       objSize.Height = 1550
'       objTextGraphicObject.setSize(objSize)
        objTextGraphicObject.GraphicURL = FileURL
        oText.insertTextContent(oCursor.Start, objTextGraphicObject, false)

        oField.dispose()
        Exit Do
    End If
Loop

End Sub