Java apache poi, устанавливающий формулу ячейки - PullRequest
4 голосов
/ 25 марта 2010

Я пытаюсь установить формула ячейки, которая ссылается на ячейки из других книг. Однако когда я открываю программно сгенерированную книгу, ячейки формулы отображаются как #REF !. Я распечатаю формулы, которые были сгенерированы в журнале. Если я вырежу их и вставлю в ячейки, будут вытянуты числа из внешних книг.

        String formula = "'C:\\tmp\\ForecastAggregate\\Total Products\\[ForecastWorksheet.xls]2010 Budget'!C10"; 
        HSSFCell cell = row.createCell(0); //row was created above
        cell.setCellFormula(formula);

Может ли кто-нибудь помочь?

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Я дал быстрое тестовое чтение формулы из рабочего листа, и она вышла без одинарных кавычек, как:

[test.xls] testsheet! A1

Когда я попытался установить это как формулу, я получил ошибку:

Исключение в потоке "main" java.lang.RuntimeException: нет внешней рабочей книги с именем 'test.xls'. Ссылки, по-видимому, подсказывают, что при чтении формулы, использующей внешнюю ссылку, необходимо загрузить рабочую книгу в формула оценки и настройки среды. Тем не менее, я попробовал это, но это все равно не сработало ... но это может быть что-то посмотреть:

 // Set up the workbook environment for evaluation
 HSSFFormulaEvaluator ev = new HSSFFormulaEvaluator(testwb); 
 String[] workbookNames = { "test.xls", };
 HSSFFormulaEvaluator[] evaluators = { ev, };
 HSSFFormulaEvaluator.setupEnvironment(workbookNames, evaluators); 

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.html

1 голос
/ 27 апреля 2010

Вы можете обойти эту проблему, используя динамическую оценку или ссылку, используя функцию INDIRECT .

Функция INDIRECT оценивает значение ячейки, где вычисляемая ячейка извлекается из значения другой ячейки.

Например,

  1. В ячейке A1 укажите ссылку на ячейку в виде простого текста (не формулы), например "C: \ tmp \ ForecastAggregate \ Total Products \ [ForecastWorksheet.xls] Бюджет на 2010 год! C10"
  2. В A2, в ячейке, в которой вы хотите отобразить значение этой ссылочной ячейки, поместите формулу

    = INDIRECT (A1)

Это выберет целевую ячейку из A1 и покажет ее значение в A2.

В Java вы можете настроить шаблон, в котором вы создадите отдельный рабочий лист (например, "irectRef ") для управления косвенными ссылками. Всякий раз, когда вы пишете внешнюю ссылку на ячейку, вы вместо этого пишете INDIRECT (xx) и помещаете ссылку в ячейку xx на листе «irectRef ». Учитывая, что Poi в основном являются интерфейсами, вы можете сделать это прозрачно, без изменений кода в коде вашего компоновщика электронных таблиц Java.

В Excel также есть макрос EVALUATE, который динамически оценивает формулы, что было бы еще проще, но это официально недокументировано (но подробно документировано в других местах!) И может поддерживаться не во всех версиях Office.

Надеюсь, это поможет!

0 голосов
/ 26 марта 2010

Попробовал осмотреться, но единственная информация, которую я смог найти для этой проблемы, - это отчет об ошибках Apache, который показывает, что это давняя ошибка:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46670

Хотя ссылки на другие листы в той же книге, кажется, работают без проблем

...