我使用的是 apache-poi(3.16 and 4.0.0)
来生成一个excel文件。我需要删除指定的行(删除行并移动到最后一行),并在最后一行之后追加数据。当我移动这一行时,我发现它并没有像预期的那样工作,我的代码是这样的(rowNum < lastRowNum)。
这是我的代码(rowNum < lastRowNum)。
shiftRows1
sheet.shiftRows(rowNum, rowNum, sheet.getLastRowNum() - rowNum, true, false);
shiftRows2
sheet.shiftRows(rowNum + 1, sheet.getLastRowNum(), -1, true, false);
附加行
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
不能使用。为什么?HSSF
后不更新 lastRowNum。appendRow
我怎么能实现它使用 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);
}
}