我目前正在开发一个使用包含数据透视表的模板 excel 文件的 Java 应用程序。
模板文件还有一个为数据透视表提供种子的数据表。此数据表通过 Apache POI api 动态加载到 java 应用程序中。
当我打开 excel 文件时,我必须手动刷新数据透视表才能正确加载数据。
有什么方法可以使用 POI api 刷新数据透视表,这样我就不必手动执行了吗?
我目前正在开发一个使用包含数据透视表的模板 excel 文件的 Java 应用程序。
模板文件还有一个为数据透视表提供种子的数据表。此数据表通过 Apache POI api 动态加载到 java 应用程序中。
当我打开 excel 文件时,我必须手动刷新数据透视表才能正确加载数据。
有什么方法可以使用 POI api 刷新数据透视表,这样我就不必手动执行了吗?
有可能的。在 中PivotCacheDefinition
,有一个属性refreshOnLoad
可以设置为true
。然后在打开工作簿时刷新缓存。更多信息在这里。
在 POI 中,这可以通过调用setRefreshOnLoad(boolean bool)
CTPivotCacheDefinition 上的方法来完成,该方法将布尔值作为参数。
编辑:Apache POI 现在提供了创建数据透视表的可能性,并且默认情况下数据透视表在加载时刷新。XSSFPivotTable 类
这篇文章说您可以打开数据透视表上的一个选项,该选项将导致它在每次打开工作簿时自动刷新:
希望在您使用 Apache POI 刷新或扩展数据透视表所基于的数据行之后,这仍然是正确的。
对此的基本答案是否定的。POI 是一个文档格式阅读器和编写器。更新数据透视表是一个 excel 引擎问题。当然,另一个应用程序可能会尝试在此处复制 Excel 引擎的行为,但这确实会变得很难看。我建议使用Joel 的通过 web 服务访问 excel COM 对象的解决方法来完成这种事情。
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*
}
}
}
这可能有效:
XSSFPivotTable pivotTable = pivotSheet.getPivotTables().get(0);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setRefreshOnLoad(true);