Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用apache poi从Excel读取下拉列表内容_Java_Android_Apache Poi - Fatal编程技术网

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

Java 使用apache poi从Excel读取下拉列表内容,java,android,apache-poi,Java,Android,Apache Poi,我需要在Excel工作表中的特定单元格上创建一个下拉列表(数据验证),并将其读回 借助于ApachePOI提供的教程,我能够在Excel工作表中创建下拉列表,但在再次阅读时,我还需要阅读下拉列表内容,以便在UI上呈现类似的下拉列表 有什么建议吗?我似乎在HSSF中找不到从HSSF表检索数据验证的任何机制。所以如果你有一个.xls文件,你就不走运了 但是,如果您有一个.xlsx文件,那么XSSFSheet提供了一个方法来检索工作表上所有XSSFDataValidations的列表,该列表返回一个列

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

借助于ApachePOI提供的教程,我能够在Excel工作表中创建下拉列表,但在再次阅读时,我还需要阅读下拉列表内容,以便在UI上呈现类似的下拉列表


有什么建议吗?

我似乎在HSSF中找不到从
HSSF表
检索
数据验证的任何机制。所以如果你有一个.xls文件,你就不走运了

但是,如果您有一个.xlsx文件,那么
XSSFSheet
提供了一个方法来检索工作表上所有
XSSFDataValidation
s的列表,该列表返回一个
列表


您需要对它们进行循环,调用以检查
CellRangeAddressList
,查看它是否适用于您的单元格。如果是,则调用以访问
DataValidationConstraint
对象,您可以在该对象上调用以获取字符串数组。

DataValidation甚至存储在HSSF工作簿中,但它位于库的
内部工作表中,并且由于它是
私有的
,因此应用程序程序员无法访问它。 我已经使用Java反射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;
}
private ArrayList init(FileInputStream fis)引发InvalidFormatException、IOException、NoSuchFieldException、IllegalArgumentException、IllegalAccessException{
HSSFWorkbook hWorkbook=(HSSFWorkbook)WorkbookFactory.create(fis);
HSSFSheet hSheet=hWorkbook.getSheetAt(1);//要在其上读取数据验证的工作表
c类=org.apache.poi.hssf.usermodel.HSSFSheet.Class;
字段字段=c.getDeclaredField(“_sheet”);
字段。setAccessible(true);
对象internalSheet=field.get(hSheet);
InternalSheet is=(InternalSheet)InternalSheet;
DataValidityTable dvTable=is.getOrCreateDataValidityTable();
c2类=org.apache.poi.hssf.record.aggregates.DataValidityTable.Class;
field2=c2.getDeclaredField(“_validationList”);
字段2.setAccessible(true);
对象记录=field2.get(dvTable);
ArrayList dvRecords=(ArrayList)记录;
返回DVR记录;
}

感谢您的建议我能够使用HSSF工作簿阅读数据验证,我使用反射API获取验证列表。我有一个
XSSFSheet
,不幸的是,它返回一个空的
ArrayList
,即使我定义了下拉列表。不知道为什么。谢谢你的代码@GauravGupta。如何使用poi从下拉列表(数据验证列表)中设置/选择值。