Apache POI Копировать строку с формулой n раз

у меня есть лист с 6 столбцами и примерно 50 тыс. строк. Я хотел бы скопировать одну строку n раз. Пока делаю так:

for (int i=0; i<=excel_max_row; i++) {
        row = sheet3.createRow((short) i);
        cell = row.createCell(0);
        cell.setCellFormula("IFERROR(LOOKUP(Template!A"+(i+2)+",'Dropdown-Values'!A:A,'Dropdown-Values'!B:B),\"\")");

        cell = row.createCell(1);
        cell.setCellFormula("IF(Template!B"+(i+2)+"=0,\"\",Template!B"+(i+2)+")");

        cell = row.createCell(2);
        cell.setCellFormula("IFERROR(LOOKUP(Template!C"+(i+2)+",'Dropdown-Values'!C:C,'Dropdown-Values'!D:D),\"\")");

        cell = row.createCell(3);
        cell.setCellFormula("IFERROR(LOOKUP(Template!D"+(i+2)+",'Dropdown-Values'!E:E,'Dropdown-Values'!F:F),\"\")");

        cell = row.createCell(4);
        cell.setCellFormula("IFERROR(LOOKUP(Template!E"+(i+2)+",'Dropdown-Values'!E:E,'Dropdown-Values'!F:F),\"\")");

        cell = row.createCell(5);
        cell.setCellFormula("IF(Template!F"+(i+2)+"=0,\"\",Template!F"+(i+2)+")");
}
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

Это работает, но очень медленно, потому что excel_max_row может быть до 50k. Есть ли способ быстро скопировать строку n раз со всеми форумами?

Большое спасибо


person ayasha    schedule 20.09.2017    source источник
comment
что для вас very slow?   -  person XtremeBaumer    schedule 20.09.2017
comment
Я подозреваю, что evaluateAllFormulaCells является основной причиной замедления. Прочитайте Пересчет формул, чтобы узнать об альтернативах.   -  person Axel Richter    schedule 20.09.2017
comment
221288 мс для 200 строк, и да, проблема в оценке   -  person ayasha    schedule 20.09.2017
comment
Отлично, вы нашли решение. Но мне любопытно, как row = sheet3.createRow((short) i); сможет создать 50 000 строк, поскольку short имеет максимальное значение 32 767. Подсказка Sheet.createRow(intномер_строки). Не знаю, откуда ваш кастинг на short.   -  person Axel Richter    schedule 20.09.2017


Ответы (1)


Я оцениваю всю формулу, когда пользователь открывает файл:

wb.setForceFormulaRecalculation(true);
person ayasha    schedule 20.09.2017