我试图从Excel工作簿中提取一个双值向量。Excel看起来不返回一维数组,而是返回多维数组(维度数为2)。
我从Excel获得的数据是SafeArray格式的(我也可以有变体,但基本上是相同的问题)。
我正在寻找一种快速的方法将双重数组提取到Java对象中,而不需要循环SafeArray中的所有值。
看看SafeArray中的方法,有一个: getDoubles(int sa_idx,int nelems,double[] ja,int ja_start)。
显然,文档是空的,而且我无法确定这个方法是干什么的,因为尝试使用它没有给我任何结果。
谢谢。
发布于 2011-01-19 03:00:39
我假设您的数据来自电子表格(Range对象),而不是VBA代码。
在这种情况下,Excel将给您一个变体的SafeArray ( VBA术语中的Variant()),而不是双倍的SafeArray (Double()),不管单元格的内容是什么。而且,数组总是二维的,这是正确的(或者,如果范围大小正好是1x1,它将返回一个变量)。
我不熟悉JACOB,是的,文档看起来相当缺乏。难道getDoubles()只在SafeArray是双打的SafeArray时才能工作吗?你试过使用getVariants()吗?如果你能拿回什么,我们就会知道我们走的路是对的。
记住,就性能而言,你被困住了。有人(你或图书馆)将不得不写那个循环。变体不会神奇地变成双变量;必须有人遍历数组,调用Win32 VariantChangeType()或等效方法,从变体中提取双字段(在雅各布中,您显然调用了changeType()然后getDouble()),最后将结果放入JACOB数组中。我不知道雅各布会为你做这件事,还是你自己去做。
不熟悉雅各布,我不确定我是否有道理,但我希望这能有所帮助。祝好运。
PS:
我觉得我需要澄清关于打电话给VariantChangeType()的评论。这在技术上是可选的,但我发现通过VariantChangeType()或类似的方法显式地将变体转换为我感兴趣的数据类型是有益的。将数字存储为字符串或其他东西太容易了,特别是当源是像Excel这样的自由格式时。当您使用像CDbl()这样的函数时,这个API调用就是VB/VBA所调用的。请注意,要提供一个日期而不是双倍,只需一点错误的格式设置即可。
如果您是绝对肯定的,除了肯定所有的单元格都包含数字(双)和Excel将永远不会返回其他任何东西,那么一定要直接调用雅各布的getDouble()并跳过转换步骤。
https://stackoverflow.com/questions/4723577
复制相似问题