Использование метода JACOB SafeArray getDoubles () - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь извлечь из рабочей книги Excel вектор двойных значений. Похоже, Excel не возвращает одномерный массив, но многомерный (количество измерений 2).

Данные из Excel хранятся в формате SafeArray (у меня тоже может быть Variant, но это в основном та же проблема).

Я ищу быстрый способ извлечения массива double в объект Java без необходимости зацикливания всех значений в SafeArray.

Глядя на методы в SafeArray, есть следующий: getDoubles (int sa_idx, int nelems, double [] ja, int ja_start)

Очевидно, что документация пуста, и я не могу определиться с тем, что делает этот метод, поскольку попытка использовать его не дала мне никаких результатов.

Спасибо.

1 Ответ

0 голосов
/ 19 января 2011

Я предполагаю, что здесь ваши данные получены из электронной таблицы (объекта 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 напрямую и пропустите шаг преобразования.

...