我有两个arraylist。第一个数组列表a1包含行数,第二个数组列表a2包含像这样的单元格数:
我在这里想要做的是我要根据我存储在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;
}
}
}
更新:
运行代码时,结果如下:
答案 0 :(得分:1)
在给定的示例中,a1
和a2
具有8个元素,因此给定代码中的代码循环逻辑为
对于具有
的每个列的具有'x'循环的每个行,设置背景颜色
因此设置了第0和第2列的1,2,5-8行的背景色。
要快速修复,只需更改代码以循环a1
和a2
中的每对元素。
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);
}
}
但是,使用两个数组存储坐标不是很好,因为a1
和a2
的长度可能不同(由于编程错误),并且导致难以调试的意外行为。
要解决此问题,我们可以使用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);
}
}
更具可读性且更易于调试。