使用Apache POI刷新数据透视表时,getPivotCacheDefinition返回空值

时间:2018-12-12 03:41:53

标签: java excel apache-poi pivot-table

将数据输入数据表后,我想刷新数据透视表

我阅读了之前的两个问题[this] [1]和[this] [2]。有两种方法可以做到这一点

一种方法是

右键单击数据透视表-> ivotTable选项->数据->打开文件时检查刷新数据

这正在工作,我想要一种自动化的方式,所以我尝试了这种方式

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 :(得分:1)

您是正确的,当从现有XSSFPivotTable.getPivotCacheDefinition()文件中读取XSSFPivotTable*.xlsx无法正常工作。这是因为从文件中获取XSSFPivotTable的方式。请参见XSSFSheet.readXSSFPivotTable是从工作表的相关文档部分读取的。但是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();
 }
}