Я предполагаю, что здесь ваши данные получены из электронной таблицы (объекта Range), а не кода VBA.
В этом случае Excel передаст вам SafeArray of Variants (Variant()
в терминологии VBA), а не SafeArray с двойным числом (Double()
), независимо от того, каким будет содержимое ячеек. И вы правы, что массив всегда будет двумерным (или он вернет один вариант, если размер диапазона точно равен 1x1).
Я не знаком с JACOB, и да, документация выглядит недостаточно. Может ли быть так, что getDoubles()
работает только тогда, когда SafeArray является SafeArray of Double? Вы пытались использовать getVariants()
? Если вы что-то получите, мы узнаем, что мы на правильном пути.
Имейте в виду, что с точки зрения производительности, вы застряли. кому-то (вам или библиотеке) придется написать этот цикл. Варианты волшебным образом не станут двойниками; кто-то должен будет пройти через массив, вызвать Win32 VariantChangeType()
или эквивалентный метод, извлечь двойное поле из Variant (очевидно, в JACOB вы вызываете changeType()
затем getDouble()
) и, наконец, поместить результаты в двойной Java массив. Будет ли JACOB делать это для вас или вам придется делать это самостоятельно, я понятия не имею.
Не знаком с JACOB. Я не уверен, что понимаю, но надеюсь, это поможет. Удачи.
[PS:]
Я чувствую, что должен уточнить этот комментарий о звонке VariantChangeType()
. Это технически необязательно, но я нахожу целесообразным явное преобразование вариантов в интересующий меня тип данных с помощью VariantChangeType()
или эквивалентного метода. Числа слишком легко хранить в виде строк или чего-то еще, особенно когда источником является такой же произвольный формат, как в Excel. Этот вызов API является именно тем, что вызывает VB / VBA, когда вы используете функцию, подобную CDbl()
. Помните, что для того, чтобы получить ДАТУ вместо двойного, вам нужно немного ошибочного форматирования.
Если вы абсолютно уверены в том, что все ячейки будут содержать числа (двойные числа), и Excel никогда больше не вернет вам ничего, тогда непременно вызовите getDouble()
JACOB напрямую и пропустите шаг преобразования.