首页 文章

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

提问于
浏览
6

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

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

有什么建议?

2 回答

  • 6

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

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

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

  • 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;
    }
    

相关问题