如何匹配2个Arraylist整数之间的行和单元格

时间:2018-11-19 01:40:21

标签: java apache-poi

我有两个arraylist。第一个数组列表a1包含行数,第二个数组列表a2包含像这样的单元格数:

enter image description here

我在这里想要做的是我要根据我存储在a1和a2中的行和单元格的数量来设置颜色,基于行和单元格的值在X的位置像这样存储在a1和a2内部:

  a1: contain the current no of row that x located

  a2: contain the current no of cell that x located

我已经尝试过了:

for (int v3 : a1) {
            for (int p3 : a2) {
                XSSFRow BOFF = sheet.getRow(v3);
                if (BOFF.getCell(p3) != null) {
                    BOFF.getCell(p3).setCellStyle(offcolor);
                } else {
                    Cell cell1 = BOFF.createCell(p3);
                    cell1.setCellStyle(offcolor);
                }
            }
        }

但是结果与上面图像中红色突出显示的单元格中的结果不正确。我尝试在a1和a2之间切换,但结果也相同。任何人都知道如何执行此操作,以便它可以在X上正确显示颜色?

更新:

在这里,我提供了如何将数据添加到arraylist中:

    ArrayList<Integer> a1= new ArrayList<Integer>();
    ArrayList<Integer> a2= new ArrayList<Integer>();

这是我搜索行和单元格的方式

for (int i = 0; i < mainArrayList.size(); i++) {
ArrayList<String> row = mainArrayList.get(i);
for (int t = 0; t < row.size(); t++) {

    if (row.get(t).equals("X")) {

        a1.add(i);
        a2.add(t);
        continue;
    }
  }
}

更新:

运行代码时,结果如下:

enter image description here

1 个答案:

答案 0 :(得分:1)

原因

在给定的示例中,a1a2具有8个元素,因此给定代码中的代码循环逻辑为

  

对于具有每个列的具有'x'循环的每个行,设置背景颜色

因此设置了第0和第2列的1,2,5-8行的背景色。

解决方案

要快速修复,只需更改代码以循环a1a2中的每对元素。

for (int i = 0; i < a1.size(); i++) {
    int rowIndex = a1.get(i);
    int colIndex = a2.get(i);
    XSSFRow BOFF = sheet.getRow(rowIndex);
    if (BOFF.getCell(colIndex) != null) {
        BOFF.getCell(colIndex).setCellStyle(offcolor);
    } else {
        Cell cell1 = BOFF.createCell(colIndex);
        cell1.setCellStyle(offcolor);
    }
}

但是,使用两个数组存储坐标不是很好,因为a1a2的长度可能不同(由于编程错误),并且导致难以调试的意外行为。

要解决此问题,我们可以使用CellAddress类POI并将代码重构为

for (CellAddress xCellAddress : xCellAddresses) {
    XSSFRow BOFF = sheet.getRow(xCellAddress.getRow());
    if (BOFF.getCell(xCellAddress.getColumn()) != null) {
        BOFF.getCell(xCellAddress.getColumn()).setCellStyle(offcolor);
    } else {
        Cell cell1 = BOFF.createCell(xCellAddress.getColumn());
        cell1.setCellStyle(offcolor);
    }
}

更具可读性且更易于调试。