Как найти источник данных сводной таблицы, используя OpenXML - PullRequest
1 голос
/ 23 ноября 2011

Я использую 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?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Сводные таблицы используют кэш данных для хранилища данных по причинам производительности и абстракции. Помните, у вас может быть точка, которая указывает на вызов веб-службы. Кеш сам хранит эту ссылку. Для сводок, которые ссылаются на данные в других местах рабочей книги, вы можете получить к ним доступ в EPPlus следующим образом:

worksheet.PivotTables[0].CacheDefinition.SourceRange.FullAddress;
0 голосов
/ 30 июня 2017

Если кому-то интересно обновить источник данных с помощью 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...