我来自 PHP/JS/AS3/... 这种语言。现在我正在学习 Libreoffice 的基础知识,并且我正在努力寻找如何获得与我用来与其他语言一起使用的关联数组类似的东西。
我想做的是拥有这种结构:
2016 => 十月 => afilename.csv
2016 => 四月 => anotherfilename.csv
以年份为主键,然后是月份和一些数据。更多我试图找到信息,更多我感到困惑,所以如果有人能告诉我一些关于如何组织我的数据的信息,我会很高兴。
谢谢!
我来自 PHP/JS/AS3/... 这种语言。现在我正在学习 Libreoffice 的基础知识,并且我正在努力寻找如何获得与我用来与其他语言一起使用的关联数组类似的东西。
我想做的是拥有这种结构:
2016 => 十月 => afilename.csv
2016 => 四月 => anotherfilename.csv
以年份为主键,然后是月份和一些数据。更多我试图找到信息,更多我感到困惑,所以如果有人能告诉我一些关于如何组织我的数据的信息,我会很高兴。
谢谢!
正如@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,
使用记事本或 GEdit 等文本编辑器创建包含上述代码的文件。然后放在这里。
要运行它,请打开 Writer 并转到Tools -> Macros -> Run Macro
,然后在My Macros
.
这个问题很久以前就问过了,但答案只对了一半。
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。)
我不熟悉 LibreOffice(或 OpenOffice.org)BASIC 或 VBA,但我没有在文档中找到任何类型的关联数组、散列或其他人称之为的任何内容。
但是,许多现代 BASIC 方言允许您将自己的类型定义为一系列字段。那么这只是使用类似的东西的问题
Dim SomeArray({count|range}) As New MyType
我认为这与不利用外部库的情况一样接近。也许Python-UNO 桥会有所帮助,因为 Python 具有这样的功能(字典),但我不确定。我也不知道它会如何影响性能。您可能更喜欢 Java 而不是 Python 来与 UNO 进行交互,这也没关系:有java.util.HashMap
类型。抱歉,我帮不上忙,但要记住的重要一点是,在没有外部帮助的情况下,任何 BASIC 代码往往都符合英语中“基本”一词的含义。