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