Почему я получаю IllegalArgumentException при использовании copyRowFrom(...) в XSSFRow?

Я пытаюсь использовать copyRowFrom(...); скопировать первую строку электронной таблицы в первую строку новой таблицы XSSFS, но что-то не работает правильно. Вы можете найти класс XSSFRow и метод здесь: https://github.com/apache/poi/blob/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java#L581

я собираюсь IllegalArgumentException("amountToMove must not be zero") от FormulaShifter.java: https://github.com/apache/poi/blob/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java#L80

Кажется, что проблема в строке 623 XSSFRow, где FormulaShifter.createForRowCopy(...) вызывается с параметром rowDifference = 0 потому что исходная строка равна 0, а строка назначения равна 0: https://github.com/apache/poi/blob/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java#L623

Я не знаю, может быть, это ошибка, но при достижении строки 80 в FormulaShifter.java параметр rowDifference соответствует amountToMove, который равен 0, поэтому он генерирует исключение IllegalArgumentException.

Я что-то упустил или это ошибка copyRowFrom(...); метод в XSSFRow?

2 ответа

Ты прав. Это ошибка в 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();

 }
}
      //fix amountToMove must not be zero:srcRows index base destStartRow+1,avoid the same
int indexAdd1 = 1;
            for (Row row : failRowList) {
                row.setRowNum(indexAdd1);
                indexAdd1++;
            }
            failSheet.copyRows(failRowList,0, CellCopyPolicyFactory.newOnlyValue());
Другие вопросы по тегам