无法通过多个 for 循环写入 excel 行列 (apache poi)

Not able to write excel row column (apache poi) by multiple for loop

我有一个包含多个 sheet 的 xlsx 文件,我正在使用 apache poi 编写 excel,在 sheet2 中,我有 2 列 我想用 运行 一个 for 循环填充每一列,但我看到只有最后一个 for 循环被写入前一个在最终写入的输出文件中变成空白,我想用这些 for 循环写两列请帮助。

for(int  i=0;i<fileNamesArray.length;i++)
    {
        XSSFRow row = worksheet1.createRow(i+1);
        cell = row.createCell(0);

        cell.setCellValue(fileNamesArray[i].toString());

    }//this dont get written 



    for(int i=0;i<fileDatesArray.length;i++)
    {
        XSSFRow row = worksheet1.createRow(i+1);
        cell = row.createCell(1);
        cell.setCellValue(fileDatesArray[i].toString());

    }//only this get written

这是完整的代码

    public class DashBoard {

    public void writeDashBoard() throws IOException, SQLException
    {
        CODToolUtil codToolUtil = new CODToolUtil();
        // Read property file to initialize constants
        String templateDashBoardFile = codToolUtil.getPropValues("templateDashBoardFile");
        String outputDir = codToolUtil.getPropValues("outputDir");
        String dirSeprator = codToolUtil.getPropValues("dirSeprator");
        String fdate = CODToolUtil.getDate();
        CODDAO coddao=new CODDAO();
        LinkedHashSet<String> hs= new LinkedHashSet<String>();
        LinkedHashSet<String> hs1= new LinkedHashSet<String>();
        FileInputStream fsIP= new FileInputStream(new File(templateDashBoardFile)); //Template file
        XSSFWorkbook wb = new XSSFWorkbook(fsIP);

        XSSFSheet worksheet = wb.getSheetAt(0);



        Cell cell = null; 

        cell = worksheet.getRow(1).getCell(0);
        cell.setCellValue(CODToolUtil.getDate());//Date
        cell = worksheet.getRow(1).getCell(1);
        int allfiles=coddao.getAllfiles();
        cell.setCellValue(allfiles);//All Files

        cell = worksheet.getRow(1).getCell(2);
        int callfilesY=coddao.getAllProcessedfilesCallY();
        cell.setCellValue(callfilesY);//All Y Files

        cell = worksheet.getRow(1).getCell(3);
        int callfilesN=coddao.getAllProcessedfilesCallN();
        cell.setCellValue(callfilesN);//All N Files

        cell = worksheet.getRow(1).getCell(4);
        int allLTE=coddao.getAllProcessedfilesLTE();
        cell.setCellValue(allLTE);//All LTE Files

        cell = worksheet.getRow(1).getCell(5);
        int allWCDMA=coddao.getAllProcessedfilesWCDMA();
        cell.setCellValue(allWCDMA);//All WCDMA Files
        //Sheet 0 OverView Complete
        //Sheet 1 Successfull CT
        XSSFSheet worksheet1 = wb.getSheetAt(1);

        hs=coddao.getAllProcessedfilesNameY();
        hs1=coddao.getAllProcessedfilesDateY();
        Object[] fileNamesArray =  hs.toArray();
        Object[] fileDatesArray =  hs1.toArray();





        for(int  i=0;i<fileNamesArray.length;i++)
        {
            XSSFRow row = worksheet1.createRow(i+1);
            cell = row.createCell(0);

            cell.setCellValue(fileNamesArray[i].toString());

        }//this dont get written 



        for(int i=0;i<fileDatesArray.length;i++)
        {
            XSSFRow row = worksheet1.createRow(i+1);
            cell = row.createCell(1);
            cell.setCellValue(fileDatesArray[i].toString());

        }//only this get written



        fsIP.close();
        File saveDirectory = new File(outputDir);// Create OutPutDirectory
        saveDirectory.mkdir();
        String savefilePath = saveDirectory.getAbsolutePath();
        FileOutputStream output_file = newFileOutputStream(newFile(savefilePath+dirSeprator+fdate+"-"+templateDashBoardFile)); // save in output
        wb.write(output_file); // write changes save it.
        output_file.close(); // close the stream




    }

public static void main(String[] args) throws IOException, SQLException {
    new DashBoard().writeDashBoard();
}
}

尝试

for(int  i=0;i<fileNamesArray.length;i++)
{
    XSSFRow row = worksheet1.createRow(i+1);
    cell = row.createCell(0);
    cell.setCellValue(fileNamesArray[i].toString());
    cell = row.createCell(1);
    cell.setCellValue(fileDatesArray[i].toString());
}

而不是使用那两个循环。我想你在第二个循环中调用 worksheet1.createRow 时会覆盖你的行。

您正在创建同一行两次 - 可能会覆盖在第一个循环中创建的 "first" 行,而在第二个循环中创建 "second" 行。

如果 fileNamesArray 和 fileDatesArray 大小相同,您可以将循环组合为:

for(int  i=0;i<fileNamesArray.length;i++)
{
    XSSFRow row = worksheet1.createRow(i+1);
    cell1 = row.createCell(0);
    cell1.setCellValue(fileNamesArray[i].toString());

    cell2 = row.createCell(1);
    cell2.setCellValue(fileDatesArray[i].toString());
}

检查哪个数组更大并循环第一个,然后循环第二个数组,但不是使用worksheet1.createRow(i+1) - 使用worksheet1.getRow(i+1),重用您在第一个循环中创建的行元素。

注意:理论上,即使数组大小不同你仍然可以使用一个循环,只要确保你应用相关检查以避免ArrayIndexOutOfBoundsException。

gradeList 是一个字符串数组列表,值为“80”、“81”...“85”

         for(int y = 0; y < gradeList.size(); y++){
            HSSFRow row1 = worksheet.createRow((short) 1);//1
            HSSFCell cell1 =row1.createCell((short) y+1);//2
            cell1.setCellValue("" + gradeList.get(y));//3
            HSSFCellStyle cellStylei = workbook.createCellStyle();//4
            cellStylei.setFillForegroundColor(HSSFColor.GREEN.index);
            cell1.setCellStyle(cellStylei);//6
         }

代码输出:_, _, _, _, _, 85。 预期输出:80、81、82、83、84、85。

将代码更改为

        HSSFRow row1 = worksheet.createRow((short) 1);//1
        HSSFCell cell1;
        for(int y = 0; y < gradeList.size(); y++){

            cell1 = row1.createCell((short) y+1);//2
            cell1.setCellValue("" + gradeList.get(y));//3

        }
        HSSFCellStyle cellStylei = workbook.createCellStyle();//4
        cellStylei.setFillForegroundColor(HSSFColor.GREEN.index);//5

代码按预期打印 80、81、82、83、84 和 85,但使用前六行代码它只打印 85。有人可以向我解释为什么第一个错误或不起作用,并且如果可能的话,您还可以解释一下第 4、5 和 6 行的作用吗?