0

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

我从 Excel 获得的数据是 SafeArray 格式(我也可以有 Variant,但基本上是同样的问题)。

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

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

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

谢谢。

4

1 回答 1

0

我在这里假设您的数据来自电子表格(范围对象),而不是 VBA 代码。

在这种情况下,无论单元格的内容是什么,Excel 都会给您一个变体的 SafeArray(Variant()在 VBA 术语中),而不是一个双精度的 SafeArray ( )。Double()你是正确的,数组总是二维的(或者如果范围大小正好是 1x1,它将返回一个 Variant)。

我不熟悉 JACOB,是的,文档看起来相当缺乏。难道getDoubles()只有当 SafeArray 是 Doubles 的 SafeArray 时才有效?你试过用getVariants()吗?如果你得到一些回报,我们就会知道我们走在正确的轨道上。

请记住,在性能方面,你被卡住了。某人(您或图书馆)将不得不编写该循环。变体不会神奇地变成双打;有人将不得不遍历数组,调用 Win32VariantChangeType()或等效方法,从 Variant 中提取双精度字段(显然在您调用changeType()then的 JACOB 中getDouble()),最后将结果放入 Java 双精度数组中。JACOB 会为你做这件事,还是你必须自己做,我不知道。

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

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

如果您绝对肯定,肯定所有单元格都将包含数字(双精度数)并且 Excel 将永远不会返回给您任何其他内容,那么请务必getDouble()直接调用 JACOB 并跳过转换步骤。

于 2011-01-19T03:00:39.440 回答