Использование метода 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() непосредственно и пропустите шаг преобразования.

Другие вопросы по тегам