POI: получить формулу для ссылки на строку как именованную ссылку

Итак, я пытаюсь получить формулу для ссылки на строку, например. (=2:2 / =Sheet1!2:2 и т. д.), на который ссылается именованный диапазон, например. test_row

Если я использую метод getAddress для ячеек, он работает правильно, но если я определяю именованный диапазон, например. test_row с адресом =Sheet1!2:2 и попытайтесь получить доступ к его формуле через namedRange.getRefersToFormula(), я понял Sheet1!1048576:1048576. С другой стороны, тот же случай для ссылки на столбец =A:A с именованным диапазоном test_col работает правильно.
Я не изучал исходный код библиотеки POI, поэтому не могу сказать, связана ли это с библиотекой или с тем, как Excel сохраняет формулы для ссылок на строки. Вопрос в том, сталкивался ли кто-нибудь с этой проблемой и нашел ли обходной путь?

UPD: благодаря @AlexRichter я узнал, что все описанное выше работает для абсолютных адресов, например. =$2:$2 или =Sheet1!$2:$2

Остается вопрос, почему это не работает для относительных адресов?

Тесты проводились с:

poi: 5.2.5 
poi-ooxml: 5.2.5
poi-ooxml-schemas: 4.1.2
openjdk 21.0.2

Почему имя не относится к =Sheet1!$2:$2, а не к относительному =Sheet1!2:2? Если относительно, ссылка изменяется при изменении активной строки. Использование абсолютной ссылки =Sheet1!$2:$2 работает независимо от того, какая активная строка установлена.

Axel Richter 23.05.2024 13:10

@AxelRichter, твоя точка зрения действительно была верной! Сначала я подумал: да, это работает так, как вы описали, но как это связано с проблемой, описанной в исходном вопросе? Но когда я тестировал абсолютный адрес, функция действительно возвращала правильный адрес. Я до сих пор не понимаю, почему это не работает с относительными адресами, но на данный момент такое решение мне подходит. Я обновлю исходный вопрос, и если больше не появится идей, я закрою его с помощью этого обходного пути. Спасибо!

Hello_Own_World 23.05.2024 18:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Именованные диапазоны обычно указывают на абсолютные отношения. Например, =Sheet1!$2:$2 вместо относительного =Sheet1!2:2. Именованные диапазоны, относящиеся к относительным отношениям, ведут себя странно.

Если установить именованный диапазон для ссылки на =Sheet1!2:2, в то время как ячейка в строке 3 является активной ячейкой, то этот именованный диапазон ссылается на =Sheet1!2:2 только в том случае, если ячейка в строке 3 является активной ячейкой. Если ячейка в строке 2 является активной, то этот именованный диапазон относится к =Sheet1!1:1. А если ячейка в строке 1 является активной, то этот именованный диапазон относится к =Sheet1!1048576:1048576. Excel хранит то, к чему относится именованный диапазон, когда ячейка A1 является активной. Итак, он хранит =Sheet1!1048576:1048576. И это то, что вы получаете.

Абсолютная ссылка =Sheet1!$2:$2 не зависит от активной ячейки. Таким образом, именованный диапазон, который ссылается на =Sheet1!$2:$2, всегда будет ссылаться на эту ссылку.

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