如何继续循环并基于arraylist创建新的单元格

时间:2018-12-07 01:07:01

标签: java excel loops apache-poi indexoutofboundsexception

我有一个字符串arraylist名称,像这样的代码:

[a,b,c,d]

和另一个字符串数组列表,其中包含诸如DWS这样的名称的数据:

[a11,a22,a33,a44,a55,a66,a77,b11,b22,b33,b44,b55,b66,b77,c11,c22,c33,c44,c55,c66,c77,d11,d22,d33,d44,d55,d66,d77]

我想做的是要像这样将DWS arraylist写入excel文件:

enter image description here

我已经尝试过这种方式:

FileInputStream file1 = new FileInputStream(new File(namefile));
    XSSFWorkbook wb1 = new XSSFWorkbook(file1);
    XSSFSheet sheet1 = wb1.getSheetAt(0);

        int limit = 7;
        for (int m = 0; m < code.size(); m++) {
            for (int x = 0; x < DWS.size(); x++) {
                for (int i = 0; i < limit; i++) {
                    Row row2 = sheet1.getRow(i + 2);
                    Cell cell = row2.createCell(m * 3 + 4);
                    cell.setCellValue(DWS.get(x));
                }
            }
        }

但是我得到的结果是: enter image description here

有什么办法解决这个问题吗?

更新

我按照建议这样更改代码:

int limit = 7;
for (int i = 0; i < limit; i++) {
        Row row2 = sheet1.getRow(i + 2);
        for (int m = 0; m < code.size(); m++) {
            Cell cell = row2.createCell(m * 3 + 4);
            cell.setCellValue(DWS.get(i));
        }
    }

结果是这样的:

enter image description here

它仅循环前7个数据。我需要它来继续其余的arraylist。像第一张图片一样。

更新

让我再次解释我的代码流程

1)它将DWS arraylist循环到第一个单元格为5号的单元格中,并循环到最后一行,即第7号行,

2)然后,到达第7行之后,它应该创建一个新的单元格,该单元格位于Cell cell = row2.createCell(m * 3 + 4);行中,然后再次从DWS arraylist数据继续循环。

3)此步骤将继续进行,直到到达DWS的最后一个arraylist数据为止

有可能这样做吗?

UPDATE 2.0

我改为:

int cellValueIndex = 0;
    for (int i = 0; i < limit; i++) {
        Row row2 = sheet1.getRow(i + 2);
        for (int m = 0; m < code.size(); m++) {
            Cell cell = row2.createCell(m * 3 + 4);
            cell.setCellValue(DWS.get(cellValueIndex));
            cellValueIndex++;
        }
    }

但是我遇到了这样的错误:

java.lang.IndexOutOfBoundsException

UPDATE 3.0

我改成这个,但结果仍然是错误的

int cellValueIndex = 0;
    for (int i = 0; i < limit; i++) {
        Row row2 = sheet1.getRow(i + 2);
        for (int m = 0; m < code.size(); m++) {
            Cell cell = row2.createCell(m * 3 + 4);
            cell.setCellValue(DWS.get(cellValueIndex));
        }
        cellValueIndex = cellValueIndex + 1;
    }

enter image description here

UPDATE 4.0

我对此进行了更改:

    int cellValueIndex = 0;
    int counter = 0;
    for (int i = 0; i < limit; i++) {
        Row row2 = sheet1.getRow(i + 2);
        Cell cell = row2.createCell(4);
        cell.setCellValue(DWS.get(cellValueIndex));
        cellValueIndex++;

        int x = row2.getRowNum();

        if (x == limit) {

            for (int m = 1; m < code.size(); m++) {
                Cell cell1 = row2.createCell(m * 3 + 4);
                cell1.setCellValue(DWS.get(cellValueIndex + 1));
                cellValueIndex++;

            }
        }
    }

结果是这样的:

enter image description here

但是当我尝试设置i = 0;时,就像这样:

int cellValueIndex = 0;
    for (int i = 0; i < total1; i++) {
        Row row2 = sheet1.getRow(i + 2);
        Cell cell = row2.createCell(4);
        cell.setCellValue(DWS.get(cellValueIndex));
        cellValueIndex++;

        int x = row2.getRowNum();

        if (x == total1) {
            i = 0;
            for (int m = 1; m < shiftcode.size(); m++) {
                Cell cell1 = row2.createCell(m * 3 + 4);
                cell1.setCellValue(DWS.get(cellValueIndex));
                cellValueIndex++;
                i++;
            }
        }
    }

我遇到这样的错误:

java.lang.IndexOutOfBoundsException

1 个答案:

答案 0 :(得分:0)

这里有3个for循环!但是,正如我所看到的,您正在第三个循环中创建单元格,其中x的值是DWS中的最后一个表示性值。如果DWS只是像元值的来源,那么您应该为此使用一个单独的索引,而不要为此保留循环。

在这种情况下,尽管您没有从最终结果中意识到,但它正在创建DWS.size乘以表及其单元!您不会从结果中意识到这一点,因为您看到的是最后执行的表,该表仅包含值d77。而且您只对所有单元格都放了一个值,因为在最后一个循环中,DWS.get(x)始终是常数,因此您不必这样做。

您必须为每个单元格设置不同的值。

解决方案: 您只需要2个循环。

int cellValueIndex = 0;
for (int m = 0; m < limit; m++) {
    // create a row here
    for (int n = 0; n < code.length; n++) {
       // take the value from DWS like DWS.get(cellValueIndex) and 
       // keep increamenting cellValueIndex by one always
    }
}