Есть ли способ отфильтровать скрытые имена в XSSFWorkbook.allNames? - PullRequest
0 голосов
/ 18 апреля 2020

Меня интересует получение списка пользовательских именованных диапазонов (как это выглядит в пользовательском интерфейсе приложения Excel) с использованием Apache POI.

Я могу отфильтровать встроенные модули, используя свойства c stati XSSFName , но могут быть и другие, которые устанавливаются плагинами et *1013*. Ниже приведен (сокращенный) пример из реального мира со скрытыми именами:

<definedName name="user_named_range">...</definedName>
<definedName name="_xlnm._FilterDatabase" hidden="1">...</definedName>
<definedName name="CIQWBGuid" hidden="1">...</definedName>
<definedName name="ExactAddinConnection" hidden="1">...</definedName>

workbook.allNames возвращает все из них. Как я могу распознать user_named_range как пользовательский и пропустить все остальные?

1 Ответ

2 голосов
/ 18 апреля 2020

До сих пор XSSFName не имеет доступа к атрибуту hidden базового CTDefinedName. Так что, если нужно, нужно получить этот базовый CTDefinedName. К сожалению, метод getCTName имеет только защищенный доступ. Но, к счастью, есть java.lang.reflect.

Пример:

import java.io.FileInputStream;

import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;

import java.lang.reflect.Method;

class ReadExcelXSSFNameDetails {

 public static void main(String[] args) throws Exception {

  XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("./inputFile.xlsm"));

  for (XSSFName name : workbook.getAllNames()) {
   String nameName = name.getNameName();

   Method getCTName = XSSFName.class.getDeclaredMethod("getCTName");
   getCTName.setAccessible(true);
   CTDefinedName ctName = (CTDefinedName)getCTName.invoke(name);
   //System.out.println(ctName);

   boolean isHidden = ctName.getHidden();
   System.out.println("Found name " + nameName + ". Is this name hidden? " + isHidden);

  }

  workbook.close();

 }

}

Теперь вы можете определить, имеет ли сохраненное имя скрытый атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...