2014-01-17 4 views
6

Мне нужно создать раскрывающийся список (Проверка данных) в конкретной ячейке в листе Excel и прочитать их обратно.Чтение выпадающего списка содержимого из Excel с помощью apache poi

С помощью учебных пособий, предоставленных Apache POI, я могу создать раскрывающийся список на листе Excel, но мне также нужно прочитать содержимое выпадающего списка при его повторном чтении, чтобы я мог визуализировать аналогичный раскрывающийся список в пользовательском интерфейсе.

Любые предложения?

ответ

6

DataValidation хранится даже в рабочей книге HSSF, но находится в библиотеке Internal Sheet, а так как это private, поэтому доступ к ней не предоставляется программисту приложений. Я использовал API Java Reflection для доступа к внутреннему листу. Этот код отлично работает для меня.

private ArrayList<DVRecord> init(FileInputStream fis) throws InvalidFormatException, IOException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { 
    HSSFWorkbook hWorkbook = (HSSFWorkbook) WorkbookFactory.create(fis); 
    HSSFSheet hSheet = hWorkbook.getSheetAt(1); // sheet on which you want to read data validation 
    Class c = org.apache.poi.hssf.usermodel.HSSFSheet.class; 
    Field field = c.getDeclaredField("_sheet"); 
    field.setAccessible(true); 
    Object internalSheet = field.get(hSheet); 
    InternalSheet is = (InternalSheet) internalSheet; 
    DataValidityTable dvTable = is.getOrCreateDataValidityTable(); 
    Class c2 = org.apache.poi.hssf.record.aggregates.DataValidityTable.class; 
    Field field2 = c2.getDeclaredField("_validationList"); 
    field2.setAccessible(true); 
    Object records = field2.get(dvTable); 
    ArrayList<DVRecord> dvRecords = (ArrayList<DVRecord>) records; 
    return dvRecords; 
} 
+0

Спасибо за код @GauravGupta. Как установить/выбрать значение из раскрывающегося списка (список данных) с помощью poi. – ram

6

Я не могу найти какой-либо механизм в HSSF для извлечения DataValidation s из HSSFSheet. Поэтому, если у вас есть файл .xls, вам не повезло.

Однако, если у вас есть .xlsx файл, а затем XSSFSheet предоставляет способ для получения списка всех XSSFDataValidation с на листе: getDataValidations, который возвращает List<XSSFDataValidation>.

Чтобы проверить, применимо ли оно к вашей соте, вам необходимо перевернуть их все, позвонив по номеру regions(). CellRangeAddressList. Если да, то звоните getValidationConstraint для доступа к объекту DataValidationConstraint, на который вы можете позвонить getExplicitListValues, чтобы получить массив строк.

+0

Спасибо за ваше предложение – guptakvgaurav

+0

я был в состоянии читать DataValidation используя HSSF книгу, я использовал Reflection API, чтобы получить список проверки. – guptakvgaurav

+0

У меня есть 'XSSFSheet', к сожалению, он возвращает пустой' ArrayList', хотя у меня есть списки выпадающих списков. Не знаю, почему. – nilskp

Смежные вопросы