使用apache poi从Excel中读取下拉列表内容

时间:2014-01-17 08:53:38

标签: java android apache-poi

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

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

有什么建议吗?

2 个答案:

答案 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;
}