簡體   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