我正在使用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并删除lastRowNumshiftRows1
+ appendRow
+ 4.0.0/3.16
+ HSSF
:清除rowNum并清除lastRowNumshiftRows2
+ appendRow
+ 4.0.0
+ XSSF
:损坏的文件;修复后,删除lastRowNum并清除> = rowNum的行shiftRows2
+ appendRow
+ 4.0.0/3.16
+ HSSF
:删除rowNum并且不能追加行(lastRowNum始终等于删除前的lastRowNum)shiftRows2
+ appendRow
+ 3.16
+ XSSF
:工作测试后,不能使用
shiftRows1
。为什么HSSF
在appendRow
之后不更新lastRowNum?如何使用shiftRows2
和3.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);
}
}