如何使用OpenXML查找数据透视表的数据源
本文关键字:数据源 透视 数据 何使用 OpenXML 查找 | 更新日期: 2023-09-27 18:15:33
我正在使用EPP打开和编辑现有的excel文档。
该文档包含2个工作表-一个数据透视表(名为pivot)和一个数据(Data!$A$1:$L$9899)
。
我用下面的代码引用了excel数据透视表,但是找不到与数据源相关的任何属性。
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中查找?
数据透视表使用数据缓存作为数据存储以提高性能&抽象的原因。请记住,您可以使用指向web服务调用的枢轴。缓存本身就是用来存储引用的。对于引用工作簿中其他位置数据的枢轴点,您可以在EPPlus中像这样访问它:
worksheet.PivotTables[0].CacheDefinition.SourceRange.FullAddress;
如果有人有兴趣用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;
}