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

Gau*_*pta 7 java android apache-poi

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

在提供的教程的帮助下Apache POI,我能够在Excel工作表中创建一个下拉列表,但我还需要在再次阅读时阅读下拉列表内容,以便我可以渲染类似的下拉列表在UI上列出.

有什么建议?

rge*_*man 6

我似乎无法在HSSF中找到任何机制来从中检索DataValidations HSSFSheet.所以如果你有一个.xls文件,那你就不走运了.

但是,如果您有.xlsx文件,则XSSFSheet提供一个方法来检索工作表上所有XSSFDataValidations 的列表:getDataValidations,它返回一个List<XSSFDataValidation>.

你需要遍历所有这些,调用regions()以检查CellRangeAddressList它是否适用于你的单元格.如果是,则调用getValidationConstraint以访问该DataValidationConstraint对象,您可以在该对象上调getExplicitListValues用以获取字符串数组.


Gau*_*pta 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;
}
Run Code Online (Sandbox Code Playgroud)