UDF /用户定义的函数libreoffice basic,内置帮助/提示

时间:2016-12-21 11:57:27

标签: input macros basic udf libreoffice-calc

我在LibreOffice calc中做了一个函数。它有效,但我希望有一个conext帮助/提示功能,就像内置的LibreOffice功能一样。

示例:当我键入“= besselk(”时,它会显示提示BESSELK(X; N)。使用函数向导时,还会显示函数和参数说明。 Besselk besselk

假设我有一个计算矩形区域的函数

function arearect(a, b)
arearect = a * b
end function

我想有这样的事情:

function arearect(a, b)
FUNCTION DESCRIPTION "Compute rectangle area"
ARGUMENT DESCRIPTION "base length"
ARGUMENT DESCRIPTION "height"
arearect = a * b
end function

所以,当我输入“= arearect”时,会出现参数说明,所有描述符都会出现在函数向导中。

感谢

1 个答案:

答案 0 :(得分:0)

将用户定义的函数创建为Spreadsheet Add-In。然后在定义加载项的.xcu文件的Description节点中输入帮助文本。

例如,我创建了一个名为REVERSE的函数。这是我的CalcAddIns.xcu文件:

<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          oor:name="CalcAddIns" oor:package="org.openoffice.Office">
  <node oor:name="AddInInfo">
    <node oor:name="name.JimK.ReverseStringImpl" oor:op="replace">
      <node oor:name="AddInFunctions">
        <node oor:name="reverse" oor:op="replace">
          <prop oor:name="DisplayName"><value xml:lang="en">reverse</value></prop>
          <prop oor:name="Description">
            <value xml:lang="en">Flips a string backwards.  For example "apple" becomes "elppa".</value>
          </prop>
          <prop oor:name="Category"><value>Add-In</value></prop>
          <!-- This won't help, because there is no reverse() in Excel. -->
          <prop oor:name="CompatibilityName"><value xml:lang="en">reverse</value></prop>
          <node oor:name="Parameters">
            <node oor:name="s" oor:op="replace">
              <prop oor:name="DisplayName"><value xml:lang="en">s</value></prop>
              <prop oor:name="Description"><value xml:lang="en">The string to reverse.</value></prop>
            </node>
          </node>
        </node>
      </node>
    </node>
  </node>
</oor:component-data>

加载项还需要一些其他文件。这是我的XCalcFunctions.idl:

#include <com/sun/star/uno/XInterface.idl>

module name { module JimK { module CalcFunctions {

    interface XCalcFunctions
    {
      string reverse( [in] string s );
    };

}; }; };

实际实施很简单。我用过python:

def reverseString(inString):
    s = unicode(inString)
    # This is extended slice syntax [begin:end:step].  With a step of -1,
    # it will traverse the string elements in descending order.
    return s[::-1]

结果:

calc tooltip

修改

我的扩展程序的Components.py中还有另一篇文章:

class StringReverserAddIn(unohelper.Base, XCalcFunctions):
    def __init__(self, ctx):
        self.ctx = ctx

    @staticmethod
    def factory(ctx):
        return StringReverserAddIn(ctx)

    def reverse(self, inString):
        from lingt.app.calcfunctions import reverseString
        return reverseString(inString)

g_ImplementationHelper.addImplementation(
    StringReverserAddIn.factory,
    "name.JimK.LinguisticTools.ReverseStringImpl",
    ("com.sun.star.sheet.AddIn",),)

该文件在manifest.xml中声明:

<!--- The Python code -->
<manifest:file-entry
 manifest:full-path="Components.py"
 manifest:media-type="application/vnd.sun.star.uno-component;type=Python"/>

完整的扩展程序:https://extensions.libreoffice.org/extensions/lingtools