Почему я получаю IllegalArgumentException при использовании copyRowFrom (...) в XSSFRow? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать 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

Кажется, что проблема в строке 623XSSFRow, где 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 соответствует количеству ToTove, равному 0, поэтому он вызывает исключение IllegalArgumentException.

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

1 Ответ

0 голосов
/ 30 января 2019

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

 }
}
...