10

我目前正在开发一个使用包含数据透视表的模板 excel 文件的 Java 应用程序。

模板文件还有一个为数据透视表提供种子的数据表。此数据表通过 Apache POI api 动态加载到 java 应用程序中。

当我打开 excel 文件时,我必须手动刷新数据透视表才能正确加载数据。

有什么方法可以使用 POI api 刷新数据透视表,这样我就不必手动执行了吗?

4

6 回答 6

7

您可以简单地激活一个选项,该选项将在每次打开文件时刷新数据透视表。

这个微软文档说:

在“数据透视表选项”对话框的“数据”选项卡上,选中“打开文件时刷新数据”复选框。

于 2013-11-05T16:39:20.937 回答
4

有可能的。在 中PivotCacheDefinition,有一个属性refreshOnLoad可以设置为true。然后在打开工作簿时刷新缓存。更多信息在这里

在 POI 中,这可以通过调用setRefreshOnLoad(boolean bool)CTPivotCacheDefinition 上的方法来完成,该方法将布尔值作为参数。

编辑:Apache POI 现在提供了创建数据透视表的可能性,并且默认情况下数据透视表在加载时刷新。XSSFPivotTable 类

于 2013-10-23T08:52:49.267 回答
3

这篇文章说您可以打开数据透视表上的一个选项,该选项将导致它在每次打开工作簿时自动刷新:

如何使用宏刷新 Excel 工作簿中的所有数据透视表?

希望在您使用 Apache POI 刷新或扩展数据透视表所基于的数据行之后,这仍然是正确的。

于 2009-12-11T09:27:13.643 回答
1

对此的基本答案是否定的。POI 是一个文档格式阅读器和编写器。更新数据透视表是一个 excel 引擎问题。当然,另一个应用程序可能会尝试在此处复制 Excel 引擎的行为,但这确实会变得很难看。我建议使用Joel 的通过 web 服务访问 excel COM 对象的解决方法来完成这种事情。

于 2009-12-08T15:50:52.083 回答
0
 protected void setRefreshPtOnLoad(boolean refreshOnLoad){
        List<POIXMLDocumentPart.RelationPart> relationParts = ((XSSFWorkbook) workbook).getRelationParts();
        for (POIXMLDocumentPart.RelationPart part : relationParts) {
            PackageRelationship relationship = part.getRelationship();
            if (relationship.getRelationshipType().contains("pivotCacheDefinition")){
                String relationId = relationship.getId();
                XSSFPivotCacheDefinition cache = (XSSFPivotCacheDefinition)((XSSFWorkbook) workbook).getRelationById(relationId);
                CTPivotCacheDefinition ctCache = cache.getCTPivotCacheDefinition();
                ctCache.setRefreshOnLoad(refreshOnLoad);
                break; // if only pivot table cache exists in workbook, else - remove *break*
            }
        }
    }
于 2021-09-02T13:34:20.437 回答
-1

这可能有效:

XSSFPivotTable pivotTable = pivotSheet.getPivotTables().get(0);     
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setRefreshOnLoad(true);
于 2017-06-23T13:04:38.900 回答