利用Apache POI动态创建Excel表格行

wmomyfyw  于 2022-12-20  发布在  Apache
关注(0)|答案(2)|浏览(159)

我正在写一个程序来读取一个大的xml文件并从中创建一个excel文件。每个节点的属性将是excel文件中的列标题。我创建了一个Dom对象并得到了节点列表。我需要迭代通过它,对于每个节点,我需要在excel工作表中添加一行,并将节点的属性值作为列值。因此,当迭代时,我需要动态创建行。我该怎么做呢?我没有看到在apache POI中添加已创建行的功能,目前为止我看到的是每次都定义新行。我无法做到这一点,因为它有超过5000个条目。基本上我想做的是:

Node node = null;
    HSSFRow datarow = null;
    for (int i = 0; i < nodeList.getLength(); i++) {
        node = nodeList.item(i);
        datarow = spreadSheet.createRow(i);
        //set values for data row here, and add it.
        //so in the loop, next time the same variable will be assigned to spreadSheet.createRow(1) etc.
    }

我知道createRow是从spreadSheet调用的,它会将行添加到它上面。但是在循环中,相同的变量也会被赋给其他行,所以我想最后我只会得到1行。请给我一些建议。

dgsult0t

dgsult0t1#

请尝试以下操作

Node node = null;
    HSSFRow datarow = null;
    for (int i = 0; i < nodeList.getLength(); i++) {
        // On each loop you get the value of node item
        node = nodeList.item(i);
        //For every new node list you will create a row 
        datarow = spreadSheet.createRow(i);
        //Finally set the node value to the columns of the newly created Row
    }

希望这有帮助!!

gojuced7

gojuced72#

createRow已在工作表中创建了该行,并且正在返回对新创建的行的引用。您将在下一次循环迭代中丢失此引用,但它不会从工作表中删除/覆盖上一行。您可以期望最终获得正确的行数。

int totalRows = 5;
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet("Data");
    HSSFRow datarow = null;

    for (int i = 0; i <= totalRows; i++) {
        datarow = sheet.createRow(i);
        datarow.createCell(0).setCellValue(Integer.toString(i));
    } 
    
    System.out.println("Total Rows: " + sheet.getLastRowNum());
    System.out.println("First row cell value: " + sheet.getRow(0).getCell(0).getStringCellValue());
    System.out.println("Last row cell value: " + sheet.getRow(totalRows).getCell(0).getStringCellValue());

    /*
       Total rows: 5
       First row cell value: 0
       Last row cell value: 5
    */

相关问题