Java 使用ApachePOI刷新透视表

Java 使用ApachePOI刷新透视表,java,excel,apache-poi,pivot-table,aspose,Java,Excel,Apache Poi,Pivot Table,Aspose,Apache站点中没有/很少有关于ApachePOI for Pivot表的文档让我写了这篇文章 我想使用ApachePOI刷新工作簿中的透视表 请让我知道我在哪里可以得到有关这方面的适当文件和例子 代码员引用的链接有一些建议,看起来非常特定于ApachePOI&Excel。 您将看到,这里没有很好的文档是有原因的(它不受支持): 要在codeMans链接中逐字引用Solitudes的答案: 这是可能的。在PivotCacheDefinition中,有一个属性 可设置为true的refresh

Apache站点中没有/很少有关于ApachePOI for Pivot表的文档让我写了这篇文章

我想使用ApachePOI刷新工作簿中的透视表


请让我知道我在哪里可以得到有关这方面的适当文件和例子

代码员引用的链接有一些建议,看起来非常特定于ApachePOI&Excel。 您将看到,这里没有很好的文档是有原因的(它不受支持):

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

这是可能的。在PivotCacheDefinition中,有一个属性 可设置为true的refreshOnLoad。然后刷新缓存 当工作簿打开时。这里有更多信息

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

如果您需要在打开文件之前刷新数据透视表(例如,然后在进一步计算中使用数据透视表计算的数据,并让POI编写此数据透视表),那么我不确定POI是否能够实现这一点,并且可能需要使用COM解决方案连接excel。

除了,你可以查一些关于


尽管如果我必须这样做,我会手动创建一次表/图表,并使用ApachePOI更新图表,正如我所做的那样,请遵循我所做的以下操作

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

    数据透视表选项->数据->打开文件时检查刷新数据

  • 打开一个
    MyFileName.xlsx
    文件并填写数据

  • 就这些。。。 无论何时打开工作簿,它都将刷新为当前数据。:-)


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

    使用PTs将文件另存为文件。xlsm并插入VBA脚本(ALT+F11):

    创建模块并插入以下内容: Public Const pivotname 1为String=“myPivotName” Public Const sourceSheetName为String=“source” Public Const sourceColumnCount的长度=23 '在“本工作簿”一章中插入: 暗淡的光线和长的一样 私有子工作簿_Open() Application.ScreenUpdating=False ActiveWorkbook.Worksheets(sourceSheetName)。激活 '在文件中,应在CV1单元格(sheet sourceSheetName)中初步插入关键字“firstOpenFlag” “它将在下面开始行动 如果ActiveSheet.Cells(1100)=“firstOpenFlag” 然后 活动页。单元格(1100)=“” lRow=getLastRowForFirstCol(sourceSheetName) 调用updatealptcache ActiveWorkbook.Worksheets(sourceSheetName)。激活 ActiveSheet.Range(“A1”)。选择 如果结束 Application.ScreenUpdating=True 端接头 私有函数getLastRowForFirstCol(sourceSheetName作为字符串)的长度为 ActiveWorkbook.Worksheets(sourceSheetName)。激活 getLastRowForFirstCol=ActiveSheet.Cells(Rows.Count,1).End(xlUp).Row 如果getLastRowForFirstCol<2,则getLastRowForFirstCol=2 端函数 私有子更新alptcache() 数据透视表 将ws设置为工作表 对于ActiveWorkbook.Worksheets中的每个ws 对于ws.PivotTables中的每个pt pt.ChangePivotCache ActiveWorkbook.PivotCaches.Create(_ SourceType:=xlDatabase_ SourceData:=sourceSheetName+“!R1C1:R”+CStr(lRow)+“C”+CStr(sourceColumnCount)_ 版本:=xlPivotTableVersion14) 'xlPivotTableVersion14-2013年工作,2016年exlApp '降级xlPivotTableVersion以实现向后兼容性 茶几 下一个pt 下一个ws 端接头 缺点:客户端xlsApp应配置为启用VBA脚本另一个解决方案(WO VBA脚本)

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

  • sourceRef='mySourceTable'
  • 签入刷新加载
  • 在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);
        }
    
    private void updateXlTableSource(){
    XSSFTable sourceTable=((xssf工作簿)工作簿).getTable(“mySourceTable”);
    CTTable CTTable=sourceTable.getCTTable();
    字符串sourceRef=getSourceDataRange().FormataString();
    ctTable.setRef(sourceRef);
    ctTable.getAutoFilter().setRef(sourceRef);
    }
    专用CellRangeAddress getSourceDataRange(){
    XSSFSheet XSSFSheet=(XSSFSheet)workbook.getSheet(“sourceSheetName”);
    int-uBoundSourceDataRow=findFirstRetryRowFrom(xssfSheet)-1;
    如果(uBoundSourceDataRow<2){
    uBoundSourceDataRow=2;
    }
    int-uBoundSourceDataCol=findFirstRow(xssfSheet)-1;
    返回新的CellRangeAddress(0,uBoundSourceDataRow,0,uBoundSourceDataCol);
    }
    
    注意:检查tempalate.xlsx以了解未知查询。如果存在,则删除,否则将阻止PT更新


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

    您可以参考以下问题的答案,这些答案与此类似-上述问题的答案与Apache poi无关。Apache 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);
        }