gpt4 book ai didi

java - 使用 Apache POI 刷新数据透视表时 getPivotCacheDefinition 返回 null 值

转载 作者:行者123 更新时间:2023-11-30 05:52:06 25 4
gpt4 key购买 nike

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

我阅读了之前的两个问题 [this][1] 和 [this][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()返回空值。

有没有办法自动刷新数据透视表?

最佳答案

您是对的,从现有 *.xlsx 文件读取 XSSFPivotTable 时,XSSFPivotTable.getPivotCacheDefinition() 无法正常工作。这是因为 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();
}
}

关于java - 使用 Apache POI 刷新数据透视表时 getPivotCacheDefinition 返回 null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53735734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com