向上移动单元格 - Apache POI Get t

Shift cells upward- Apache POI Get t

我正在使用 Apache POI XSSF 从 JTable 获取列和行并创建一个 excel 文件。我试图根据名为“名称”的列的值来分隔 table,每个名称都有不同的 sheet。

我的问题是,当我尝试将它们分开时,其他 sheets 在顶部生成空白单元格,空白单元格的数量取决于它们上方的记录数量。这是我的代码:

//Create a blank sheet
XSSFSheet sheet_Mark = workbook.createSheet("Mark");
XSSFSheet sheet_John = workbook.createSheet("John");

for(int i = 0; i < jTable1.getRowCount(); i++){
    Integer id_Values = (int) jTable1.getValueAt(i,0);
    String name_Values = (String) jTable1.getValueAt(i, 1);
    Integer age_Values = (int) jTable1.getValueAt(i,2);
    if(name_Values.equals("Mark")){
        XSSFRow row = sheet_Mark.createRow(i);
        row.createCell(0).setCellValue(id_Values);
        row.createCell(1).setCellValue(name_Values);
        row.createCell(2).setCellValue(age_Values);
    }
    else if(name_Values.equals("John")){
        XSSFRow row = sheet_John.createRow(i);
        row.createCell(0).setCellValue(id_Values);
        row.createCell(1).setCellValue(name_Values);
        row.createCell(2).setCellValue(age_Values);
    }
}

这是 sheet 的输出。假设我的 JTable 上有 5 条记录,分别是 3 Johns 和 2 Marks:

Sheet 1:
rows |     ID     |    Name    |     Age 
 1        1111        John           23
 2        2222        John           20
 3        3333        John           26

Sheet 2:
 rows |     ID     |    Name    |     Age 
  1                                 
  2        
  3
  4        4444       Mark            45
  5        5555       Mark            30

    

我对 Java 还很陌生,所以请多多包涵。我将不胜感激任何答案或解决方案。

编辑:我知道这与这行有关:

XSSFRow row = sheet_Mark.createRow(i);

也许如果我能得到 Mark 以上的行数并将其减去 i。我真的尝试过寻找解决方案,但我找不到。

Excel 工作簿中每个 sheet 的行索引独立于 JTable 中的行索引。您需要为每个 sheet.

维护一个单独的索引
//Create a blank sheet
XSSFSheet sheet_Mark = workbook.createSheet("Mark");
XSSFSheet sheet_John = workbook.createSheet("John");
int markRow = 0;
int johnRow = 0;
for(int i = 0; i < jTable1.getRowCount(); i++){
    Integer id_Values = (int) jTable1.getValueAt(i,0);
    String name_Values = (String) jTable1.getValueAt(i, 1);
    Integer age_Values = (int) jTable1.getValueAt(i,2);
    if (name_Values.equals("Mark")) {
        XSSFRow row = sheet_Mark.createRow(markRow);
        row.createCell(0).setCellValue(id_Values);
        row.createCell(1).setCellValue(name_Values);
        row.createCell(2).setCellValue(age_Values);
        markRow++;
    }
    else if (name_Values.equals("John")) {
        XSSFRow row = sheet_John.createRow(johnRow);
        row.createCell(0).setCellValue(id_Values);
        row.createCell(1).setCellValue(name_Values);
        row.createCell(2).setCellValue(age_Values);
        johnRow++;
    }
}

markRowsheet_Mark 的索引。每当向 sheet 添加一行时,都会增加 markRow。同样对于 johnRow.