В apache poi 4.0.1
, shiftRows
не корректирует ссылки на ячейки. Если строка 1 сдвинута вверх, то ссылки в ячейках остаются r = "A2", r = "B2", ... Но они должны быть скорректированы с учетом новой строки: r = "A1", r = "B1" , ...
Эта ошибка появляется только в XSSF
(Office Open XML, *.xlsx
). Бинарный файл HSSF
(BIFF, *.xls
) не имеет этой проблемы.
Пример:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;
class ExcelDeleteShiftRows {
public static void main(String[] args) throws Exception {
String filePath = "SAMPLE.xlsx";
FileInputStream inputStream = new FileInputStream(filePath);
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
int lastNum = sheet.getLastRowNum();
Row row0 = sheet.getRow(0);
if (row0 != null) sheet.removeRow(row0);
sheet.shiftRows(1, lastNum, -1);
// After that the sheet is corrupted. The shiftRows does not adjusting references of the cells.
// If row 1 is shifted up, then reference in the cells remain r="A2", r="B2", ...
// But they must be adjusted to the new row though: r="A1", r="B1", ...
// This corrects this. But of course it is unperformant.
if (sheet instanceof XSSFSheet) {
for (Row row : sheet) {
long rRef = ((XSSFRow)row).getCTRow().getR();
for (Cell cell : row) {
String cRef = ((XSSFCell)cell).getCTCell().getR();
((XSSFCell)cell).getCTCell().setR(cRef.replaceAll("[0-9]", "") + rRef);
}
}
}
FileOutputStream outputStream = new FileOutputStream(filePath);
workbook.write(outputStream);
outputStream.close();
workbook.close();
}
}
Пожалуйста, отправьте сообщение об ошибке в apache poi
, чтобы исправление было исправлено непосредственно командой разработчиков apache poi
. Этот полный пример вместе с коротким SAMPLE.xlsx
является достаточно коротким, чтобы быть помещенным в качестве примера, чтобы показать проблему.