Оценка Apache POI и SUMPRODUCT - PullRequest
       30

Оценка Apache POI и SUMPRODUCT

1 голос
/ 29 апреля 2011

У меня есть файл шаблона XLS, который я загружаю с помощью Apache POI и записываю в него множество данных, а затем сохраняю их как другой файл. У меня есть формулы в моем файле XLS как это:

=SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))

также пробовал

=SUMPRODUCT(0+(DS!B:B="IN_THIS_ONLY"),0+(DS!D:D="New trade"))

они оцениваются правильно, если я нажимаю Enter в ячейке в Excel. Тем не менее, просто позвонив

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

, кажется, не оценивает их, равно как и нажатие на кнопку «Рассчитать сейчас» в Excel - так что я предполагаю, что это специальная формула или функция.

Другие, более обычные COUNTIF s и SUMIF s работают нормально, однако они не позволяют указывать несколько условий.

POI не поддерживает формулы массива.

Есть ли способ заставить их работать. Я использую POI версии 3.7.

Ответы [ 2 ]

4 голосов
/ 02 мая 2011

Можно нажать CTRL-ALT-F9 , чтобы вручную принудительно пересмотреть все формулы в Excel.

А вот хитрость, чтобы заставить его работать автоматически при открытии рабочей книги.

Добавьте к своей формуле следующее:

+(NOW()*0)

так, например, мой SUMPRODUCT выше становится

=SUMPRODUCT((DS!B:B="IN_THIS_ONLY")*(DS!D:D="New trade"))+(NOW()*0)

И это работает! Excel теперь пересчитывает мои специальные ячейки формулы при открытии.

Причина этого заключается в том, что NOW() является энергозависимой функцией. Вот где я узнал об этом: http://msdn.microsoft.com/en-us/library/bb687891.aspx

Application.CalculateFull также работает, но только в Excel 2007 и более поздних версиях (и, конечно, необходимо запускать макросы). К сожалению, в моем случае, несмотря на то, что я использую Excel 2007, моя книга также будет открыта пользователями Excel 2003, так что это не вариант.

2 голосов
/ 01 мая 2011

Является ли SumProduct функцией формулы на основе массива?

Если это так, это объяснит проблему.Один из вариантов - добавить патч к POI, чтобы добавить недостающую поддержку.Было некоторое обсуждение списка разработчиков и bugzilla о том, что нужно, и если бы вы разместили в списке разработчиков, мы были бы рады помочь вам начать.1005 * флаг пересчета формулы и заставить Excel пересчитать значение при загрузке

...