getPivotCacheDefinition возвращает нулевое значение при обновлении сводной таблицы с помощью Apache POI - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу обновить сводную таблицу после ввода данных в таблицу данных

Я прочитал два предыдущих вопроса [это] [1] и [это] [2].есть два способа сделать это

в одну сторону

Щелкните правой кнопкой мыши свою сводную таблицу -> Параметры сводной таблицы -> Данные -> Проверить обновление данных при открытии файла

это работаетЯ хочу автоматизированный способ, поэтому я попытался таким образом

FileInputStream inputStream = new FileInputStream(new File(excelFilePath));
workbook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = workbook.getSheet("Summary");
XSSFPivotTable pivotTable = sheet.getPivotTables().get(0);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setRefreshOnLoad(true);

У меня есть две сводные таблицы на этом листе, поэтому sheet.getPrivotTable возвращает это

[Name: /xl/pivotTables/pivotTable1.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml, Name: /xl/pivotTables/pivotTable2.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml]

, но sheet.getPivotTables().get(0).getPivotCacheDefinition() возвращает нулевое значение.

Есть ли способ автоматического обновления сводной таблицы?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы правы, XSSFPivotTable.getPivotCacheDefinition() не работает должным образом, когда XSSFPivotTable был прочитан из существующего файла *.xlsx.Это из-за того, как XSSFPivotTable получается из файла.См. XSSFSheet.read : XSSFPivotTable считывается из соответствующих частей документа на листе.Но у XSSFPivotTable есть свои отношения.Но они вообще не читаются.

Вы можете отправить сообщение об ошибке на apache poi об этом.

Обходной путь: XSSFPivotTable расширяет POIXMLDocumentPart, и поэтому он знает о своих собственных связанных частях документа, где XSSFPivotCacheDefinition является одним из.

Пример:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileInputStream;

class ExcelReadPivotTables {

 public static void main(String[] args) throws Exception{

  XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("ExcelWorkbook.xlsx"));
  XSSFSheet sheet = workbook.getSheet("Summary");

  System.out.println(sheet.getPivotTables());
  if (sheet.getPivotTables().size() > 0) {
   XSSFPivotTable pivotTable = sheet.getPivotTables().get(0); 
   System.out.println(pivotTable);

   XSSFPivotCache pivotCache = pivotTable.getPivotCache();
   System.out.println(pivotCache); // null!
   XSSFPivotCacheDefinition pivotCacheDefinition = pivotTable.getPivotCacheDefinition();
   System.out.println(pivotCacheDefinition); //null!

   for (org.apache.poi.ooxml.POIXMLDocumentPart documentPart : pivotTable.getRelations()) {
    if (documentPart instanceof XSSFPivotCacheDefinition) {
     pivotCacheDefinition = (XSSFPivotCacheDefinition)documentPart;
     System.out.println(pivotCacheDefinition); //not null!
    }
   }
  }
  workbook.close();
 }
}
...