Вы правы.Это ошибка в XSSFRow
, поскольку она вызывает FormulaShifter.createForRowCopy
, даже если нечего сдвигать, поскольку номер строки назначения совпадает с номером строки источника.Вы можете отправить это как ошибку в apache poi
.
Но тогда есть необходимость в создании тестового примера, который может быть предоставлен там.Я сделал это для тебя.Код также обеспечивает обходной путь.Это сначала копирование в неправильную строку назначения, где номер строки отличается от исходного номера строки.Затем он копирует неправильную первую строку назначения в действительно нужную строку назначения.
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
class ExcelCopyRowFrom {
public static void main(String[] args) throws Exception {
XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("SAMPLE.xlsx"));
XSSFSheet srcSheet = workbook.getSheetAt(0);
XSSFRow srcRow = srcSheet.getRow(0);
XSSFSheet destSheet = workbook.createSheet();
//XSSFRow destRow = destSheet.createRow(0); //this fails because destination row number is the same as source row number
XSSFRow destRow = destSheet.createRow(1); //this works
destRow.copyRowFrom(srcRow, new CellCopyPolicy());
//workaround copy wrong first destination row to really needed destination row
XSSFRow destRowNeeded = destSheet.createRow(0);
destRowNeeded.copyRowFrom(destRow, new CellCopyPolicy());
//the remove wrong first destination row
destSheet.removeRow(destRow);
FileOutputStream outputStream = new FileOutputStream("SAMPLENEW.xlsx");
workbook.write(outputStream);
outputStream.close();
workbook.close();
}
}