【问题标题】:Refresh Pivot Table with Apache POI使用 Apache POI 刷新数据透视表
【发布时间】:2010-11-03 21:14:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我有一个要求,我很好奇您是如何根据数据表实现数据透视表的。我有一个模板 excel 表,我使用 apache poi 填充数据。但是,我在基于这些填充数据的数据透视表时遇到了问题。有什么想法吗??
  • 我还遇到问题,当我在源工作表中填写数据然后将文件写入磁盘时,结果文件中的数据透视表不完整。我为此目的使用 JXL。非常感谢任何帮助,因为我被卡住了。

标签: java apache excel pivot-table apache-poi


【解决方案1】:

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

这个Microsoft documentation 说:

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

【讨论】:

  • Apache POI 覆盖它。
  • +1!这个答案不仅为这个问题提供了解决方案,而且向我展示了一个非常有用的 Excel 选项,即使在不使用 Apache POI 时也是如此:) 在我的情况下,Apache POI 确实 not 覆盖它!我不会通过 POI 创建或操作数据透视表。我只更新数据透视图所在的数据表。
  • 我可以在 JXL 中实现同样的效果吗?我正在编写数据表,但是当 JXL 编写文件时,它只是删除了数据透视表。在这方面需要帮助。
【解决方案2】:

这是可能的。 在PivotCacheDefinition中,有一个属性refreshOnLoad可以设置为true。然后在打开工作簿时刷新缓存。 More information here.

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

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

【讨论】:

  • 调用哪个对象的方法?我的意思是setRefreshOnLoad(boolean bool)
  • 在 CTPivotCacheDefinition 上。
  • 当数据透视表已经存在于 Excel 文档中时(即它是通过 Apache POI读取,而不是创建),这不起作用。对myXSSFPivotTable.getPivotCacheDefinition() 的调用总是返回null。
【解决方案3】:

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

How can I refresh all the pivot tables in my excel workbook with a macro?

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
       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*
                  }
              }
          }
      

      【讨论】:

      • edit您的回答提供有关您提供的代码如何工作、您已更改的内容等的更多信息。纯代码的答案可能会解决原始提问者的问题,但他们不要帮助未来的读者理解解决方案。
      • 我试试看。它适用于 excel v.16 和 file.xlsx
      【解决方案6】:

      这可能有效:

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

      【讨论】:

      • XSSFPivotTable 对象没有这样的方法 getPivotTables()。 POI 负责读取和写入 Excel 文档。数据透视表是 Excel 内部的,Excel 引擎负责处理它。 Excel 引擎确保在数据更改时更新数据透视表。加载 Excel 文档时会自动刷新
      • 数据透视表有一个值,但是 pivotTable.getPivotCacheDefinition() 给出的是空值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多