WedX - журнал о программировании и компьютерных науках

Нужна помощь в реализации формул массива в apache poi api

Мне было выделено обновление существующего проекта. Предыдущий разработчик использовал jcom API для экспорта данных в листы Excel. Но jcom API не работает с 64-битными системами. Я решил изменить код и использовать apache poi api. Мне удалось сделать много методов. Моя проблема - формулы массива. Мне нужно реализовать формулы массива с помощью apache poi. Эти формулы размещены ниже, любая помощь будет более заметной. Заранее спасибо, ребята.

Формулы:

String  formula1 = "SUM(R[-2]C/1.200)";//net income  calculation from gross income
String  formula2 = "SUM(R[-1]C-R[1]C)";
String  formula3 = "SUM(R[-" + Integer.toString(listTypeTotals.size()+1) + "]C:R[-2]C)";

Я попытался установить эту ячейку как тип формулы и передать формулу как строку.

setCellFormulaStyle(sheet, 4, i+2, formula2);

 public static void setCellFormulaStyle(HSSFSheet sheet,int row, int column,String value)
  {
    HSSFRow temprow = null;
    temprow =getRow_CreateRow(sheet, row);
    temprow.createCell(column).setCellFormula(value);
  }

public static HSSFRow getRow_CreateRow(HSSFSheet sheet,int row)
{
  HSSFRow excelrow=null;
  excelrow = sheet.getRow(row);
  if(excelrow==null)
  {
    excelrow =sheet.createRow(row);
    return excelrow;
  }else
  return excelrow;
}

Я получаю следующее исключение

org.apache.poi.ss.formula.FormulaParseException: Specified named range 'R' does not exist in the current workbook.
at org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:569)
at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:517)
at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:268)
at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1119)
at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1079)
at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1066)
at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1426)
at org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1526)
at org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1510)
at org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1467)
at org.apache.poi.ss.formula.FormulaParser.Arguments(FormulaParser.java:1051)
at org.apache.poi.ss.formula.FormulaParser.function(FormulaParser.java:936)
at org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:558)
at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:429)
at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:268)
at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1119)
at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1079)
at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1066)
at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1426)
at org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1526)
at org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1510)
at org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1467)
at org.apache.poi.ss.formula.FormulaParser.unionExpression(FormulaParser.java:1447)
at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:1568)
at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:176)
at org.apache.poi.hssf.model.HSSFFormulaParser.parse(HSSFFormulaParser.java:72)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellFormula(HSSFCell.java:594)`

  • Не можете ли вы переписать формулу, чтобы исключить ссылки на массив? 02.07.2013
  • @Gagravarr Спасибо за ваш ответ. У меня есть шанс переписать формулу, но я получил динамические номера столбцов и номеров строк. Я пытаюсь, но не знаю, как это сделать, используя формат A1, B2, C3. формула1 будет использоваться для расчета чистой прибыли в зависимости от валовой прибыли. и вторая формула будет использоваться для получения суммы уплаченного НДС из общего дохода за вычетом чистого дохода. 02.07.2013

Ответы:


1

Я не уверен, как вы использовали формулу еще. Однако, если ваша проблема связана с динамической ссылкой на ячейку на основе строк и столбцов, возможно, я могу вам помочь.

Для любой ячейки, скажем "B5", во время выполнения,

cell.getReference(); 

даст вам ссылку на ячейку (как в примере... она вернет вам "B5"

cell.getReference().toString().charAt(0); 

даст вам ссылку на столбец (даст вам «B», если текущая ячейка - B5). В настоящее время

cell.getRowIndex(); 

OR

 cell.getReference().toString().charAt(1);

даст вам индекс строки. Я использовал это несколько раз для обновления/создания именованных диапазонов и формулы в моей книге.

Небольшие изменения: добавлен адрес обработки, например AZ89

Для случаев AZ99, которые мы можем использовать для этого, мы можем использовать небольшие хаки, такие как:

String str = cell.getReference();
    for(index = 0;index<str.length();index++){
        if((int)str.charAt(index)<65){
            break;
        }
    }
    String Col = str.substring(0, index);
    String Row = str.substring(index+1, str.length());
08.07.2013
  • Если вы используете такую ​​​​индексацию, она сломается на таких адресах, как AA1 28.04.2014
  • Спасибо, farmerjoe... за то, что указал на некоторые угловые случаи. Я обновил небольшой хак для тех же случаев. 29.04.2014
  • отлично! Я много работаю с POI и написал несколько подобных методов. сделали библиотеку, которая обрабатывает множество операционных инструментов, которые POI не охватывают, поскольку это в основном библиотека I/O, например, копирование ячеек, строк, листов, явная обработка сдвигов формулы строки / столбца, поиск, работа в процессе, но взгляните, это может вас заинтересовать страница github 29.04.2014
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]