Использование метода JACOB SafeArray getDoubles()
Я пытаюсь извлечь из рабочей книги Excel вектор двойных значений. Похоже, Excel не возвращает одномерный массив, но многомерный (количество измерений 2).
Данные из Excel хранятся в формате SafeArray (у меня тоже может быть Variant, но это в основном та же проблема).
Я ищу быстрый способ извлечения массива double в объект Java, без необходимости зацикливать все значения в SafeArray.
Глядя на методы в SafeArray, есть один: getDoubles(int sa_idx, int nelems, double[] ja, int ja_start)
Очевидно, что документация пуста, и я не могу определиться с тем, что делает этот метод, так как попытка использовать его не дала мне никаких результатов.
Благодарю.
1 ответ
Я предполагаю, что здесь ваши данные поступают из электронной таблицы (объекта 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()
, Имейте в виду, что все, что вам нужно, - это немного ошибочного форматирования, чтобы получить DATE вместо Double.
Если вы абсолютно уверены в том, что все ячейки будут содержать числа (двойные числа), и Excel никогда не вернет вам что-либо еще, тогда непременно позвоните в JACOB. getDouble()
непосредственно и пропустите шаг преобразования.