使用Apache POI刷新Pivot表

时间:2014-07-03 12:43:54

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

没有/关于Apache站点中的数据透视表的Apache POI的最小文档让我写这个。

我想使用Apache POI刷新工作簿中的数据透视表。

请告诉我在哪里可以获得有关此问题的正确文档和示例。

5 个答案:

答案 0 :(得分:2)

请遵循我的指示。

  1. 在MyFileName.xlsx文件中填充数据透视表的粗略数据。
  2. 通过OFFSET()Named Table创建动态范围公式作为数据透视表和绘制数据透视表的源数据。
  3. 只需右键单击数据透视表,然后选择

    pivotTable Options->Data-> Check Refresh Data when opening File

  4. 打开MyFileName.xlsx文件并填写数据。

  5. 这都是...... 无论何时打开工作簿,它都会刷新为当前数据。 : - )

    注意:通过POI创建数据透视表时,这将不起作用。

答案 1 :(得分:1)

链接codeMan指的是一些看起来非常具体的Apache POI& Excel中。 你会发现这里没有很好的文档(不支持): http://poi.apache.org/spreadsheet/limitations.html

在codeMans链接中逐字引用Solitudes答案:

  

有可能。在PivotCacheDefinition中,有一个属性   refreshOnLoad可以设置为true。然后刷新缓存   当工作簿打开时。更多信息,请点击此处。

     

<强>&GT;在POI中,这可以通过调用方法setRefreshOnLoad(boolean   bool),在CTPivotCacheDefinition

上采用布尔值作为参数

如果您需要在打开文件之前刷新数据透视表,(例如,然后在进一步的计算中使用pivottable计算数据并让POI写入此数据),那么我不确定这是否可行所有使用POI,并可能使用COM解决方案连接到excel可能是最佳选择。

答案 2 :(得分:1)

除了limitations之外,您还可以查看有关Package org.apache.poi.hssf.record.pivottable

的一些信息

虽然如果我必须这样做,我会手动创建一个表/图表并使用apache poi更新图表,因为我已经here

答案 3 :(得分:0)

将包含PT的文件另存为文件。 xlsm 并插入VBA脚本(ALT + F11):

' Create module and insert this:
Public Const pivotName1 As String = "myPivotName"
Public Const sourceSheetName As String = "source"
Public Const sourceColumnCount As Long = 23

' In "ThisWorkbook" chapter insert this:
Dim lRow As Long

Private Sub Workbook_Open()
Application.ScreenUpdating = False
ActiveWorkbook.Worksheets(sourceSheetName).Activate
' In file should preliminarily insert keyWord "firstOpenFlag" in CV1 cell (sheet sourceSheetName)
' It gona start actions below
If ActiveSheet.Cells(1, 100) = "firstOpenFlag"
Then
ActiveSheet.Cells(1, 100) = ""
lRow = getLastRowForFirstCol(sourceSheetName)
Call updateAllPTCache
ActiveWorkbook.Worksheets(sourceSheetName).Activate
ActiveSheet.Range("A1").Select
End If
Application.ScreenUpdating = True
End Sub

Private Function getLastRowForFirstCol(sourceSheetName As String) As Long
    ActiveWorkbook.Worksheets(sourceSheetName).Activate
    getLastRowForFirstCol = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    If getLastRowForFirstCol < 2 Then getLastRowForFirstCol = 2
End Function

Private Sub updateAllPTCache()
    Dim pt As PivotTable
    Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        For Each pt In ws.PivotTables
            pt.ChangePivotCache ActiveWorkbook.PivotCaches.Create( _
                SourceType:=xlDatabase, _
                SourceData:=sourceSheetName + "!R1C1:R" + CStr(lRow) + "C" + CStr(sourceColumnCount), _
                Version:=xlPivotTableVersion14)
                ' xlPivotTableVersion14 - work in 2013, 2016 exlApp
                ' Downgrade xlPivotTableVersion for backward compatibility
            pt.RefreshTable
        Next pt
    Next ws
End Sub

缺点:应将客户端xlsApp配置为启用VBA脚本

答案 4 :(得分:0)

另一种解决方案(WO VBA脚本)

tempalate.xlsx 中,在源记录集的标头上创建xlTable对象。将名称设置为xlTable,例如。 “ mySourceTable”。 还在数据透视表的文件preSet中:

  1. sourceRef ='mySourceTable'
  2. 签入RefreshOnLoad

在POI中:

private void updateXlTableSource() {
        XSSFTable sourceTable = ((XSSFWorkbook)workbook).getTable("mySourceTable");
        CTTable ctTable = sourceTable.getCTTable();
        String sourceRef = getSourceDataRange().formatAsString();
        ctTable.setRef(sourceRef);
        ctTable.getAutoFilter().setRef(sourceRef);
    }

private CellRangeAddress getSourceDataRange() {
        XSSFSheet xssfSheet = (XSSFSheet) workbook.getSheet("sourceSheetName");
        int uBoundSourceDataRow = findFirstEmptyRowFrom(xssfSheet) - 1;
        if (uBoundSourceDataRow < 2) {
            uBoundSourceDataRow = 2;
        }
        int uBoundSourceDataCol = findFirstEmptyColFromFirstRow(xssfSheet) - 1;
        return new CellRangeAddress(0, uBoundSourceDataRow, 0, uBoundSourceDataCol);
    }

注意:检查 tempalate.xlsx 中是否存在未知查询。删除(如果存在),否则将阻止PT更新

缺点:PT的autoFilter包含不存在的元素(PT模板中的元素)。