Libreoffice basic - 关联数组

时间:2016-05-11 19:08:00

标签: libreoffice basic libreoffice-basic

我来自PHP / JS / AS3 / ...这种语言。现在我正在学习Libreoffice的基础知识,而且我正在努力寻找如何获得类似于我用来与其他语言一起使用的关联数组的东西。

我要做的是拥有这种结构:

2016 =>十月=> afilename.csv

2016 =>四月=> anotherfilename.csv

以年份为主键,然后是月份和一些数据。 我试图找到更多的信息而且我更加困惑,所以如果有人能告诉我一些关于如何组织我的数据的话,我会非常高兴。

谢谢!

3 个答案:

答案 0 :(得分:1)

正如@Chrono Kitsune所说,Python和Java有这样的功能,但Basic没有。以下是LibreOffice Writer的一个Python-UNO示例:

def dict_example():
    files_by_year = {
        2016 : {'October' : 'afilename.csv',
                'November' : 'bfilename.csv'},
        2017 : {'April' : 'anotherfilename.csv'},
    }
    doc = XSCRIPTCONTEXT.getDocument()
    oVC = doc.getCurrentController().getViewCursor()
    for year in files_by_year:
        for month in files_by_year[year]:
            filename = files_by_year[year][month]
            oVC.getText().insertString(
                oVC, "%s %d: %s\n" % (month, year, filename), False)

g_exportedScripts = dict_example,

使用文本编辑器(如Notepad或GEdit)创建包含上述代码的文件。然后将其here

要运行它,请打开Writer并转到Tools -> Macros -> Run Macro,然后在My Macros下找到该文件。

答案 1 :(得分:0)

我不熟悉LibreOffice(或OpenOffice.org)BASIC或VBA,但我没有在文档中找到任何类型的关联数组,哈希或其他任何人称之为的内容。

然而,许多现代BASIC方言允许你define your own type as a series of fields。那么这只是使用像

这样的问题
Dim SomeArray({count|range}) As New MyType

我认为,如果不利用外部图书馆,你就会得到尽可能接近。也许Python-UNO bridge会有所帮助,因为Python有这样的功能(字典),但我不确定。我也不知道它会如何影响性能。您可能更喜欢使用Java而不是Python与UNO进行交互,这也没关系:java.util.HashMap类型。对不起,我无能为力,但重要的是要记住,任何BASIC代码都倾向于在没有外部帮助的情况下达到“基本”一词的含义。

答案 2 :(得分:0)

这个问题很久以前就有人问过了,但答案只对了一半。

LibreOffice Basic 确实没有本机关联数组类型。但 LibreOffice API 提供服务。 com.sun.star.container.EnumerableMap 服务将满足您的需求。

这是一个例子:

' Create the map
map = com.sun.star.container.EnumerableMap.create("long", "any")

' The values
values = Array( _
    Array(2016, "October", "afilename.csv"), _
    Array(2016, "April", "anotherfilename.csv") _
)

' Fill the map
For i=LBound(values) to UBound(values)
    value = values(i)
    theYear = value(0)
    theMonth = value(1)
    theFile = value(2)
    If map.containsKey(theYear) Then
        map2 = map.get(theYear)
    Else
        map2 = com.sun.star.container.EnumerableMap.create("string","string")
        map.put(theYear, map2)
    End If
    map2.put(theMonth, theFile)
Next

' Access to an element
map.get(2016).get("April")  ' anotherfilename.csv

如您所见,这些方法与您可以在更常用的语言中找到的方法类似。

注意:如果您遇到 IllegalTypeException,您可能必须使用 CreateUNOValue("<type>", ...) 将值转换为声明的类型。 (请参阅这个非常古老的问题 https://bz.apache.org/ooo/show_bug.cgi?id=121192 作为示例。)