繁体   English   中英

用 Apache POI 刷新 Pivot 表

[英]Refresh Pivot Table with Apache POI

我目前正在开发一个 Java 应用程序,该应用程序使用包含 pivot 表的模板 excel 文件。

模板文件还有一个数据表,用于为 pivot 表设置种子。 此数据表通过Apache POI api动态加载到java应用中。

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

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

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

这篇Microsoft文档说:

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

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

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

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

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

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

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

 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*
            }
        }
    }

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

这可能有效:

XSSFPivotTable pivotTable = pivotSheet.getPivotTables().get(0);     
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setRefreshOnLoad(true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM