C#如何获取已加入数据模型的数据透视表数据源并实现刷新
C# 绑定Excel数据模型的数据透视表数据源获取与刷新方案
问题根因
当数据透视表勾选「将此数据添加到数据模型」创建时,透视表的缓存类型会从普通工作表区域切换为OLAP缓存,不再关联原生的单元格区域对象,因此SourceData属性会返回无效值或空值。
核心实现方案(基于Microsoft.Office.Interop.Excel)
前置依赖
需先在项目中引用Microsoft.Office.Interop.Excel程序集。
1. 数据源类型判断与信息获取
using Excel = Microsoft.Office.Interop.Excel; // 初始化Excel应用实例 Excel.Application excelApp = new Excel.Application(); Excel.Workbook workbook = excelApp.Workbooks.Open(@"你的Excel文件路径"); Excel.Worksheet worksheet = workbook.Worksheets["透视表所在工作表名"]; Excel.PivotTable pivotTable = worksheet.PivotTables("你的透视表名称"); // 判断是否为绑定数据模型的OLAP透视表 if (pivotTable.PivotCache.OLAP) { // 获取数据模型连接字符串 string modelConnection = pivotTable.PivotCache.Connection; // 获取数据模型查询命令文本 string commandText = pivotTable.PivotCache.CommandText; // 以上两个属性即为该透视表的实际数据源配置 }
2. 透视表刷新实现
无需额外获取原始工作表区域,直接调用透视表缓存刷新方法即可完成数据同步:
// 刷新OLAP缓存与透视表 pivotTable.PivotCache.Refresh(); // 可选:等待刷新完成后更新透视表视图 pivotTable.RefreshTable(); // 操作完成后务必释放COM对象,避免Excel进程残留 System.Runtime.InteropServices.Marshal.ReleaseComObject(pivotTable); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); workbook.Save(); workbook.Close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
无桌面环境替代方案(基于Open XML SDK)
如果需要在无Excel客户端的服务器环境操作,可使用Open XML SDK读取透视表缓存配置:
- 定位到
WorkbookPart.PivotTableCacheDefinitionParts集合中对应透视表的缓存定义 - 读取
PivotCacheDefinition.CacheSource属性,若CacheSource.Type为External,则对应的连接信息存储在WorkbookPart.ConnectionsPart中,可获取到数据模型的关联配置。
注意事项
- 常见开源操作库(如EPPlus)目前不支持操作绑定数据模型的OLAP类型透视表,此类场景优先使用Interop或Open XML SDK实现。
- 若需要修改数据模型关联的源数据区域,需先更新Excel数据模型的关联表配置,再执行透视表刷新操作。
内容的提问来源于stack exchange,提问作者user1289576
相关产品推荐
相关产品推荐

