我需要在Excel工作表中的特定单元格上创建一个下拉列表(数据验证)并将其读回。使用apache poi从Excel中读取下拉列表内容
在Apache POI
提供的教程的帮助下,我可以在Excel工作表中创建一个下拉列表,但是在再次阅读时我还需要阅读下拉列表内容,以便可以呈现用户界面上的类似下拉列表。
有什么建议吗?
我需要在Excel工作表中的特定单元格上创建一个下拉列表(数据验证)并将其读回。使用apache poi从Excel中读取下拉列表内容
在Apache POI
提供的教程的帮助下,我可以在Excel工作表中创建一个下拉列表,但是在再次阅读时我还需要阅读下拉列表内容,以便可以呈现用户界面上的类似下拉列表。
有什么建议吗?
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;
}
我似乎无法在HSSF中找到任何机制从HSSFSheet
中检索DataValidation
。所以如果你有一个.xls文件,那你的运气不好。
但是,如果你有一个.xlsx文件,然后XSSFSheet
提供给检索所有XSSFDataValidation
S中的纸张上的列表的方法:getDataValidations
,它返回一个List<XSSFDataValidation>
。
你需要遍历它们,调用regions()
来检查以查看它是否适用于你的单元格。如果是,请致电getValidationConstraint
访问DataValidationConstraint
对象,您可以在其中调用getExplicitListValues
以获取字符串数组。
感谢您的建议 – guptakvgaurav
我能够使用HSSF工作簿读取DataValidation,我使用了反射API来获取验证列表。 – guptakvgaurav
我有一个'XSSFSheet',不幸的是它返回一个空的'ArrayList',即使我已经定义了下拉列表。不知道为什么。 – nilskp
感谢代码@GauravGupta。如何使用poi设置/从下拉列表中选择一个值(datavalidation list)。 – ram