Обновить сводную таблицу с помощью Apache POI

В настоящее время я работаю над приложением Java, которое использует файл Excel шаблона, содержащий сводную таблицу.

В файле шаблона также есть таблица данных, которая заполняет сводную таблицу. Этот лист данных динамически загружается в Java-приложение через Apache POI api.

Когда я открываю файл Excel, я должен обновить сводную таблицу вручную, чтобы данные загружались правильно.

Есть ли способ обновить сводную таблицу с помощью API-интерфейса POI, чтобы мне не приходилось делать это вручную?


person B Jammin    schedule 18.06.2009    source источник
comment
У меня есть требование, и мне любопытно, как вы этого достигли, построив сводную таблицу на листе данных. У меня есть шаблон листа Excel, который я заполняю данными с помощью apache poi. Однако у меня есть проблемы с построением моей сводной таблицы на этих заполненных данных. Любые идеи ??   -  person Ash    schedule 04.06.2014
comment
У меня также возникают проблемы с тем, что когда я заполняю данные в исходных таблицах, а затем записываю файл на диск, сводная таблица в результирующем файле не повреждена. Для этого я использую JXL. Любая помощь очень ценится, поскольку я застрял.   -  person Muhammad Salman Farooq    schedule 24.01.2018


Ответы (5)


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

В этой документации Microsoft говорится:

В диалоговом окне «Параметры сводной таблицы» на вкладке «Данные» установите флажок «Обновлять данные при открытии файла».

person FrankyFred    schedule 05.11.2013
comment
Apache POI перезаписывает его. - person Adam Arold; 21.10.2014
comment
+1! Этот ответ предоставил не только решение этой проблемы, но и показал мне очень полезную опцию Excel, даже если я не работал с Apache POI :) И в моем случае Apache POI не перезаписывает его! Я не создаю сводную таблицу как таковую и не управляю ею через POI. Я обновляю только те листы данных, к которым возвращаются сводные диаграммы. - person SebastianH; 02.11.2016
comment
Могу ли я добиться того же в JXL? Я пишу таблицы данных, но когда JXL записывает файл, он просто удаляет сводную таблицу. Нужна помощь в этом плане. - person Muhammad Salman Farooq; 24.01.2018

Это возможно. В PivotCacheDefinition есть атрибут refreshOnLoad, который может быть установлен в true. Затем кеш обновляется при открытии книги. здесь.

В POI это можно сделать, вызвав метод setRefreshOnLoad(boolean bool), который принимает логическое значение в качестве параметра в CTPivotCacheDefinition.

РЕДАКТИРОВАТЬ: Apache POI теперь предоставляет возможность создавать сводные таблицы, и сводная таблица обновляется при загрузке по умолчанию. Класс XSSFPivotTable

person Solidtubez    schedule 23.10.2013
comment
Вызвать метод для какого объекта? Я имею в виду setRefreshOnLoad(boolean bool). - person Adam Arold; 08.09.2014
comment
На CTPivotCacheDefinition. - person Solidtubez; 21.10.2014
comment
Это не работает, если сводная таблица уже существует в документе Excel (т.е. она читается через Apache POI, а не создается). Вызов myXSSFPivotTable.getPivotCacheDefinition() всегда возвращает ноль. - person SebastianH; 02.11.2016

В этом сообщении говорится, что вы можете включить параметр в сводной таблице, который заставит ее автоматически обновляться при каждом открытии книги:

Как можно Я обновляю все сводные таблицы в своей книге Excel с помощью макроса?

Надеюсь, это будет по-прежнему верно после того, как вы использовали Apache POI для обновления или расширения строк данных, на которых основаны сводные таблицы.

person Trevor Turton    schedule 11.12.2009

Основной ответ на это - нет. POI - это программа для чтения и записи формата документов. Обновление сводной таблицы - это проблема движка Excel. Конечно, другое приложение могло бы попытаться воспроизвести здесь поведение движка Excel, но это действительно будет некрасиво. Я рекомендую использовать метод Джоэла для доступа к COM-объектам Excel через веб-сервис. чтобы добиться такого результата.

person Yishai    schedule 08.12.2009

Это может сработать:

XSSFPivotTable pivotTable = pivotSheet.getPivotTables().get(0);     
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setRefreshOnLoad(true);
person ninjaxelite    schedule 23.06.2017
comment
такого метода getPivotTables () для объекта XSSFPivotTable не существует. POI выполняет работу по чтению и написанию документов Excel. Сводная таблица является внутренней для Excel, и механизм Excel позаботится об этом. Excel Engine гарантирует, что по мере изменения данных сводная таблица обновляется. Есть автообновление при загрузке документа Excel. - person Amol Dixit; 06.03.2018
comment
сводная таблица имеет значение, но pivotTable.getPivotCacheDefinition () дает нулевое значение. - person heshjse; 12.12.2018