2014-01-17 138 views
6

我需要在Excel工作表中的特定单元格上创建一个下拉列表(数据验证)并将其读回。使用apache poi从Excel中读取下拉列表内容

Apache POI提供的教程的帮助下,我可以在Excel工作表中创建一个下拉列表,但是在再次阅读时我还需要阅读下拉列表内容,以便可以呈现用户界面上的类似下拉列表。

有什么建议吗?

回答

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; 
} 
+0

感谢代码@GauravGupta。如何使用poi设置/从下拉列表中选择一个值(datavalidation list)。 – ram

6

我似乎无法在HSSF中找到任何机制从HSSFSheet中检索DataValidation。所以如果你有一个.xls文件,那你的运气不好。

但是,如果你有一个.xlsx文件,然后XSSFSheet提供给检索所有XSSFDataValidation S中的纸张上的列表的方法:getDataValidations,它返回一个List<XSSFDataValidation>

你需要遍历它们,调用regions()来检查​​以查看它是否适用于你的单元格。如果是,请致电getValidationConstraint访问DataValidationConstraint对象,您可以在其中调用getExplicitListValues以获取字符串数组。

+0

感谢您的建议 – guptakvgaurav

+0

我能够使用HSSF工作簿读取DataValidation,我使用了反射API来获取验证列表。 – guptakvgaurav

+0

我有一个'XSSFSheet',不幸的是它返回一个空的'ArrayList',即使我已经定义了下拉列表。不知道为什么。 – nilskp

相关问题