[英]Refresh Pivot table using Apache POI
没有/关于 Apache 站点中数据透视表的 Apache POI 的最少文档让我写了这个。
我想使用 Apache POI 刷新工作簿中的数据透视表。
请让我知道我可以在哪里获得有关此的适当文档和示例。
请按照我所做的以下操作。
OFFSET()
或Named Table
创建动态范围公式作为数据透视表的源数据并绘制数据透视表。只需右键单击您的数据透视表并选择
pivotTable Options->Data-> Check Refresh Data when opening File
打开MyFileName.xlsx
文件并填写数据。
这就是全部......每当您打开工作簿时,它都会刷新为当前数据。 :-)
注意:当您通过 POI 创建数据透视表时,这将不起作用。
codeMan 所指的链接有一些看起来非常特定于 Apache POI 和 Excel 的建议。 你会看到这里没有很好的文档(不支持): http : //poi.apache.org/spreadsheet/limitations.html
在 codeMans 链接中逐字引用 Solitudes 答案:
有可能的。 在 PivotCacheDefinition 中,有一个属性 refreshOnLoad 可以设置为 true。 然后在打开工作簿时刷新缓存。 更多信息在这里。
> 在 POI 中,这可以通过调用方法 setRefreshOnLoad(boolean bool) 来完成,该方法将布尔值作为参数,在 CTPivotCacheDefinition 上
如果您需要在打开文件之前刷新数据透视表,(例如,然后在进一步计算中使用数据透视表计算出的数据并让 POI 编写此内容),那么我不确定这对于 POI 是否可行,并且使用 COM 解决方案可能连接到 excel 可能是要走的路。
除了限制之外,您还可以查看有关Package org.apache.poi.hssf.record.pivottable的一些信息。
虽然如果我必须这样做,我会手动创建表格/图表一次,并将使用 apache poi 更新图表,就像我在这里所做的那样
将带有 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 脚本
另一种解决方案(WO VBA 脚本)
在tempalate.xlsx 中,在源记录集的标题上创建 xlTable 对象。 将名称设置为 xlTable,例如。 '我的源表'。 同样在数据透视表的文件预设中:
在兴趣点中:
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 的自动过滤器包含不存在的元素(来自 PT 模板的元素)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.