1

我正在使用 EPP 打开和编辑现有的 Excel 文档。

该文档包含 2 张工作表 - 一张带有数据透视表(名为 Pivot),一张带有数据(Data!$A$1:$L$9899)

我使用下面的代码引用了 ExcelPivotTable,但找不到与数据源相关的任何属性。

ExcelPackage package = new ExcelPackage(pivotSpreadsheet);

        foreach (ExcelWorksheet worksheet in package.Workbook.Worksheets)
        {
            if (worksheet.PivotTables.Count > 0)
            {
                pivotWorkSheetName = worksheet.Name;
                pivotTable = worksheet.PivotTables[0];
            }
        }

如何获取源数据的名称和范围?是否有我遗漏的明显属性或者我必须通过一些 xml 去寻找?

4

2 回答 2

3

出于性能和抽象原因,数据透视表使用数据缓存作为数据存储。请记住,您可以有一个指向 Web 服务调用的枢轴。缓存本身就是存储该引用的内容。对于在工作簿中其他地方引用数据的数据透视表,您可以像这样在 EPPlus 中访问它:

worksheet.PivotTables[0].CacheDefinition.SourceRange.FullAddress;
于 2011-12-08T18:40:34.800 回答
2

如果有人有兴趣使用 OpenXML SDK 2.5 更新数据源,那么这里是我使用的代码。

    using (var spreadsheet = SpreadsheetDocument.Open(filepath, true))
    {
            PivotTableCacheDefinitionPart ptp = spreadsheet.WorkbookPart.PivotTableCacheDefinitionParts.First();
            ptp.PivotCacheDefinition.RefreshOnLoad = true;//refresh the pivot table on document load
            ptp.PivotCacheDefinition.RecordCount = Convert.ToUInt32(ds.Tables[0].Rows.Count);
            ptp.PivotCacheDefinition.CacheSource.WorksheetSource.Reference = "A1:" + IntToLetters(ds.Tables[0].Columns.Count) + (ds.Tables[0].Rows.Count + 1);//Cell Range as data source
            ptp.PivotTableCacheRecordsPart.PivotCacheRecords.RemoveAllChildren();//it is rebuilt when pivot table is refreshed
            ptp.PivotTableCacheRecordsPart.PivotCacheRecords.Count = 0;//it is rebuilt when pivot table is refreshed
    }
    public string IntToLetters(int value)//copied from another stackoverflow post
    {
            string result = string.Empty;
            while (--value >= 0)
            {
                result = (char)('A' + value % 26) + result;
                value /= 26;
            }
            return result;
    }
于 2017-06-29T21:50:21.647 回答