如何在特定列上写?

时间:2016-08-03 07:22:17

标签: java apache-poi

我有一个包含3列的excel文件。我已经将“B”列存储到数组列表中,并检查它是否重复。现在我有问题将“重复”值写入“C”列。如何在特定列上书写?

这是我的代码

FileInputStream file = new FileInputStream(new File(
            "file name"));

    XSSFWorkbook workbook = new XSSFWorkbook(file);     
    XSSFSheet sheet = workbook.getSheetAt(0);       
    Iterator<Row> rowIterator = sheet.iterator();
    ArrayList<String> col = new ArrayList<String>();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        System.out.println(row.getRowNum());
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            if(cell.getColumnIndex()==1) {                  
                col.add(cell.getStringCellValue());
                System.out.print(cell.toString());
            }
        }
        System.out.println();           
    }
    for(int a = 0; a < 14; a++) {
        if(col.get(a).equals("Order ID")) {
            if(col.get(a).equals(col.get(a+1))) {
                System.out.println("ROW no "+a+"Double Order");
                }
        } else {
            if(col.get(a).equals(col.get(a+1)) || col.get(a).equals(col.get(a-1))) {
                if(col.get(a).trim().length()>0) {
                    System.out.println("ROW no "+a+"Double Order");
                col.add("Double");
                }
            }
        }
    }

    FileOutputStream fileOut = new FileOutputStream("file name");
    workbook.write(fileOut);
    fileOut.close();

2 个答案:

答案 0 :(得分:1)

您不需要迭代两次来分别识别和写入重复的行。你可以这样做:

private static void identifyDuplicateOrders() throws IOException {
        FileInputStream file = new FileInputStream(new File("D:\\home\\test_in.xlsx"));
        final FileOutputStream fileOut = new FileOutputStream("D:\\home\\test_out.xlsx");
        XSSFWorkbook workbook = null;
        try {
            workbook = new XSSFWorkbook(file);
            final XSSFSheet sheet = workbook.getSheetAt(0);
            final Iterator<Row> rowIterator = sheet.iterator();
            final Set<String> orderIds = new HashSet<String>();
            while (rowIterator.hasNext()) {
                final Row row = rowIterator.next();
                final int rowNumber = row.getRowNum();
                // SKIP HEADER
                if (rowNumber == 0) {
                    continue;
                }
                System.out.print("Row " + rowNumber);
                // GET ORDER ID CELL
                final Cell cell = row.getCell(1);
                if (!orderIds.add(cell.getStringCellValue())) {
                    // CREATE DOUBLE ORDER CELL
                    row.createCell(2).setCellValue("Duplicate");
                    System.out.println(" " + cell.toString() + " is Duplicate.");
                } else {
                    System.out.println(" Order is Unique");
                }
            }
            workbook.write(fileOut);
        } finally {
            workbook.close();
            file.close();
            fileOut.close();
        }

    }

答案 1 :(得分:0)

您可以在循环迭代行中写入Duplicate一词,您不需要保存值数组。要检查重复项,您可以使用设置并检查add是否返回false

e.g。

public static void main(String... args) throws IOException {
    try (FileInputStream file = new FileInputStream(new File(args[0]));
         XSSFWorkbook workbook = new XSSFWorkbook(file)) {
        Set<String> orders = new HashSet<>(20);
        XSSFSheet sheet = workbook.getSheetAt(0);
        for (Row row : sheet) {
            // skip header if needed
            if (row.getRowNum() == 0) {
                continue;
            }

            // 1 for OrderId as in example
            Cell orderCell = row.getCell(1);
            if (!orders.add(getValue(orderCell))) {
                Cell infoCell = row.getCell(2);
                if (infoCell == null) {
                    infoCell = row.createCell(2);
                }
                infoCell.setCellValue("Duplicate");
            }
        }

        // write result in new file
        workbook.write(new FileOutputStream(new File(args[0] + ".result.xlsx")));
    }
}

private static String getValue(Cell orderCell) {
    switch (orderCell.getCellType()) {
    case Cell.CELL_TYPE_NUMERIC:
        return Double.toString(orderCell.getNumericCellValue());
    case Cell.CELL_TYPE_STRING:
        return orderCell.getStringCellValue();
    }
    return null;
}