使用JACOB SafeArray getDoubles()方法

时间:2011-01-18 11:36:25

标签: java com jacob

我正在尝试从Excel工作簿中提取双值向量。 Excel看起来不会返回一维数组,而是返回多维数组(维数为2)。

我从Excel获得的数据是SafeArray格式(我也可以使用Variant,但它基本上是同一个问题)。

我正在寻找一种快速的方法将双精度数组提取到Java对象中,而无需循环使用SafeArray中的所有值。

看看SafeArray中的方法有这样一个: getDoubles(int sa_idx,int nelems,double [] ja,int ja_start)

显然文档是空的,我无法决定这个方法的作用,因为尝试使用它没有给我带来任何结果。

感谢。

1 个答案:

答案 0 :(得分:0)

我假设你的数据来自电子表格(Range对象),而不是VBA代码。

在这种情况下,Excel将为您提供一个变量的SafeArray(VBA术语中为Variant()),而不是SafeArray of double(Double()),无论这些单元格的内容是什么。你是正确的,数组将永远是二维的(如果范围大小正好是1x1,它将返回一个Variant)。

我不熟悉JACOB,是的,文档看起来相当缺乏。可能是getDoubles()只有在SafeArray是双打的SafeArray时才有效吗?您是否尝试使用getVariants()?如果你得到了回报,我们就知道我们正走在正确的轨道上。

请记住,在表现方面,你会陷入困境。某人(你或你的图书馆)将不得不写这个循环。变种不会神奇地成为双打;有人必须遍历数组,调用Win32 VariantChangeType()或等效方法,从Variant中提取双字段(显然在JACOB中调用changeType()然后getDouble()),最后放入Java双数组中的结果。无论JACOB是为您做这件事还是您必须自己做,我都不知道。

不熟悉JACOB我不确定我是否有意义,但我希望这会有所帮助。祝你好运。

<强> [PS:]
我觉得我需要澄清关于致电VariantChangeType()的评论。这在技术上是可选的,但我发现通过VariantChangeType()或等效方法将变体显式转换为我感兴趣的数据类型通常是健康的。将数字存储为字符串或其他东西太容易了,特别是当源是像Excel这样的自由格式时。当您使用CDbl()之类的函数时,此API调用正是VB / VBA调用的。请注意,为您提供DATE而不是Double,需要进行一些错误的格式化。

如果你是绝对的,肯定的是所有单元格都包含数字(双打),而Excel将永远不会返回给你任何其他东西,然后一定要直接调用JACOB的getDouble()并跳过转换步骤。 / p>