我正在使用apache-poi(3.16 and 4.0.0)生成Excel文件。我需要删除指定的行(删除行并移至最后一行),并将数据追加到最后一行之后。当我移动生产线时,我发现它没有按预期工作。

这些是我的代码(rowNum
shiftRows1

sheet.shiftRows(rowNum, rowNum, sheet.getLastRowNum() - rowNum, true, false);


shiftRows2

sheet.shiftRows(rowNum + 1, sheet.getLastRowNum(), -1, true, false);


appendRow

setRowValue(sheet.getLastRowNum() + 1, objectArray);


我的问题


shiftRows1 + appendRow + 4.0.0/3.16 + XSSF:清除rowNum并删除lastRowNum
shiftRows1 + appendRow + 4.0.0/3.16 + HSSF:清除rowNum并清除lastRowNum
shiftRows2 + appendRow + 4.0.0 + XSSF:损坏的文件;修复后,删除lastRowNum并清除> = rowNum的行
shiftRows2 + appendRow + 4.0.0/3.16 + HSSF:删除rowNum并且不能追加行(lastRowNum始终等于删除前的lastRowNum)
shiftRows2 + appendRow + 3.16 + XSSF:工作


测试后,不能使用shiftRows1。为什么HSSFappendRow之后不更新lastRowNum?如何使用shiftRows23.16实现它?

最佳答案

我通过以下方式(apache-poi 3.16)处理此问题:

private void removeRow(int rowNum) {
    Row row = sheet.getRow(rowNum);
    if (row == null) return;
    sheet.removeRow(row);

    int lastRowNum = sheet.getLastRowNum();
    if (rowNum < lastRowNum) {
        // bad way: shift the removed row down
        sheet.shiftRows(rowNum + 1, lastRowNum, -1, true, false);
        // remove lastRow: avoid Sheet#getLastRowNum() return same value after Sheet#shiftRows
        if (workbook instanceof HSSFWorkbook) removeRow(lastRowNum);
    }
}

10-04 18:32