Как я могу разделить Pivot Cache между несколькими Apache POI Pivot? - PullRequest
0 голосов
/ 31 октября 2018

У меня возникают проблемы при попытке открыть мой файл Apache POI excel, который состоит из большого объема данных (600 000/700 000 строк), который передает три сводные диаграммы, сгенерированные на трех разных листах (с использованием потоковой передачи SXSSFWorkbook).

Когда я пытаюсь открыть созданный Excel di MSExcel, появляется следующее сообщение: «Excel не может выполнить это действие с помощью доступных ресурсов Excel ... попробуйте закрыть что-то ...». Итак, чтобы сэкономить ресурсы, я попытался разделить кеш между первыми двумя точками: ОК! Лучше! Но когда я пытаюсь разделить кеш даже с третьим, MSExcel выдает мне ошибки и пытается восстановить, но с ошибочными результатами.

Есть ли решение для совместного использования кэша с более чем двумя сводными точками с одним и тем же источником данных? Или я что-то не так делаю?

Вот код:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFPivotTable firstPivot = preparefirstPivot(...);
XSSFPivotTable secondPivot = preparesecondPivot(...);
XSSFPivotTable thirdPivot = preparethirdPivot(...);

/* START: shared cache */
/* I remove from workbook all PivotCaches except the firstPivot one */
long firstPivotCacheId = firstPivot.getCTPivotTableDefinition().getCacheId();
List<CTPivotCache> ctPivotCacheList = wb.getCTWorkbook().getPivotCaches().getPivotCacheList();
for (int i = 0; i < ctPivotCacheList.size(); i++) {
    CTPivotCache ctPivotCache = ctPivotCacheList.get(i);
    if(ctPivotCache.getCacheId() != firstPivotChaceId ) {
        wb.getCTWorkbook().getPivotCaches().removePivotCache(i);
    }
}
/* I share the firstPivot cache with the other pivots */
/* work! OK! */
secondPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
secondPivot.setPivotCache(firstPivot.getPivotCache());
/* here does not work! why?!??!! */
thirdPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
thirdPivot.setPivotCache(firstPivot.getPivotCache());

Что-то не так? Большое спасибо !!!

1 Ответ

0 голосов
/ 06 ноября 2018

Решено:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFPivotTable firstPivot = preparefirstPivot(...);
XSSFPivotTable secondPivot = preparesecondPivot(...);
XSSFPivotTable thirdPivot = preparethirdPivot(...);

/* START: shared cache */
                List<CTPivotCache> ctPivotCacheList = wb.getCTWorkbook().getPivotCaches().getPivotCacheList();
                if (ctPivotCacheList != null && ctPivotCacheList.size() > 1) {
                    /* useful only with more than one PivotCache */
                    List<Long> ctPivotCacheIdList = new ArrayList<Long>();
                    for (int i = 0; i < ctPivotCacheList.size(); i++) {
                        CTPivotCache ctPivotCache = ctPivotCacheList.get(i);
                        ctPivotCacheIdList.add(new Long(ctPivotCache.getCacheId()));
                    }

                    long firstPivotCacheId = firstPivot.getCTPivotTableDefinition().getCacheId();
                    for (int i = ctPivotCacheIdList.size() - 1; i >= 0; i--) {
                        if (ctPivotCacheIdList.get(i) != firstPivotCacheId) {
                            ctPivotCacheList.remove(i);
                        }
                    }

                    secondPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
                    secondPivot.setPivotCache(firstPivot.getPivotCache());
                    thirdPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
                    thirdPivot.setPivotCache(firstPivot.getPivotCache());
}

Спасибо всем

...