我需要在Excel工作表中的特定单元格上创建一个下拉列表(数据验证)并将其读回。
借助Apache POI
提供的教程,我可以在Excel工作表中创建一个下拉列表,但我还需要在再次阅读时阅读下拉列表内容,以便我可以在UI上呈现类似的下拉列表。
有什么建议吗?
答案 0 :(得分:6)
我似乎无法在HSSF中找到任何机制来从DataValidation
检索HSSFSheet
。所以如果你有一个.xls文件,那你就不走运了。
但是,如果您有.xlsx文件,那么XSSFSheet
会提供一种方法来检索工作表上XSSFDataValidation
的所有List<XSSFDataValidation>
列表,该列表返回{{1} }}
您需要循环遍历所有内容,调用getDataValidations
检查CellRangeAddressList
以查看它是否适用于您的单元格。如果是,请调用regions()
访问DataValidationConstraint
对象,您可以在其上调用getValidationConstraint
以获取字符串数组。
答案 1 :(得分:6)
DataValidation甚至存储在HSSF工作簿中,但它位于库的Internal Sheet
中,因为它是private
所以对应用程序员不会访问它。
我使用Java Reflection API来访问内部工作表。
这段代码对我来说很好。
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;
}