java - 如何检查excel列标题在apache poi中是否按特定顺序排列

标签 java arraylist apache-poi

我必须检查某些列标题名称是否以特定顺序出现在 Excel 工作表中。姓名为:名字、姓氏(可选)、电子邮件 ID、电话号码、地址(可选)。

我需要检查输入的 Excel 工作表是否具有必填列以及可选列的任意组合。 例如:名字、电子邮件地址、电话号码(均为必填项) 名字、姓氏、电子邮件 ID、电话 总共可能有 4 种情况。

我已将列标题存储在数组列表中。 (如果有一个有效的方法来解决我的问题陈述,请告诉我!)。

            public void readAndUpload() throws FileNotFoundException, IOException 
{
    FileInputStream file = new FileInputStream(new File("path.."));
    HSSFWorkbook workbook = new HSSFWorkbook(file);
    HSSFSheet sheet = workbook.getSheetAt(0);
    HSSFRow row = sheet.getRow(0);
    Iterator<Cell> cellIterator = row.cellIterator();
    ArrayList<String> headerCell = new ArrayList<String>(5);
    while(cellIterator.hasNext())
    {
        Cell cell = cellIterator.next();
        headerCell.add(cell.getStringCellValue());
    }

    ArrayList<String> validHeaders = new ArrayList<>(Arrays.asList("First Name", "Email Id","Phone Number"));
    if(headerCell.contains(validHeaders))
    {
        //validation logic here
    }
    else
    {
        System.out.println("Mandatory fields not present");
    }
    file.close();

}

最佳答案

我从您的要求中了解到,您想验证以下内容, 1. excel中的标题是否是允许的标题(强制和可选)。 2. 是否存在强制 header 。 3. 强制 header 是否按顺序排列。

这是一种解决方案。

public class HeaderProblem {

    public static void main(String[] args) {
        List<String> headersFromExcel = Arrays.asList("EMail", "Phone", "Address", "Last Name", "First Name");
        System.out.println(validate(headersFromExcel));
    }

    private static boolean validate(List<String> headers) {
        List<String> mandatoryHeaders = Arrays.asList("First Name", "EMail", "Phone");
        List<String> optionalHeaders = Arrays.asList("Last Name", "Address");
        List<String> allHeaders = new ArrayList<>(mandatoryHeaders);
        allHeaders.addAll(optionalHeaders);
        Map<String, Integer> headerIndexMap = IntStream.range(0, headers.size())
                                                    .boxed()
                                                    .collect(Collectors.toMap(i -> headers.get(i), i -> i));


        if(!allHeaders.containsAll(headers)) {
            System.out.println("Some headers exist which are not allowed");
            return false;
        }

        if (!headers.containsAll(mandatoryHeaders)) {
            System.out.println("Mandatory headers are not present");
            return false;
        }

        System.out.println(mandatoryHeaders.stream()
                .map(headerIndexMap::get)
                .collect(Collectors.toList()));

        // Check if the manadatory headers are in order
        Integer result = mandatoryHeaders.stream()
                        .map(headerIndexMap::get)
                        .reduce(-1, (x, hi) -> x < hi ? hi : headers.size());


        if (result == headers.size()) {
            System.out.println("Mandatory headers are not in order");
            return false;
        }
        return true;
    }

}

在这里,我假设 headersFromExcel 字段是从 Excel 中提取的标题列表。

还有一件事,在您使用的代码中,

if(headerCell.contains(validHeaders))

在这里,您应该使用 containsAll() 而不是 contains(),因为 contains 会将传递的参数视为一个对象,并将与 ArrayList 的每个单独单元格进行比较,并且在您的情况下将始终返回 false。

关于java - 如何检查excel列标题在apache poi中是否按特定顺序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233143/

相关文章:

java - 如何获取XSSFSimpleShape对象的背景颜色?

java - Spring:如果我无法扩展 AbstractTestNGSpringContextTests,如何在 Testng 测试类中获取 spring applicationContext

java - 如何使用 spring 和mockito 获取被测对象的字段

java - Netbeans 8.2 所有项目均已损坏,未找到 JDK

java - 如何使用 Java EE 安全性从 HttpSessionListener 访问登录主体?

java - ArrayList 数据无法正确传输到 Java 中的数组

java - 使用java读取单列excel表

java - Apache POI 将包含公式的行复制 n 次

java - 在 Java 中对集合进行连接和分离的最佳方法

java - 创建对象数组的 ArrayList