使用 Interop c# 检测 Excel Microsoft中的数据透视表

本文关键字:数据 透视 Microsoft Interop 检测 Excel 使用 | 更新日期: 2023-09-27 18:36:05

我正在尝试使用 Microsoft 互操作 c# 检测 excel 中的单元格是否包含数据透视表Microsoft

我想做的是遍历下面的代码所示的所有单元格,然后如果单元格包含数据透视表,我想将该单元格的行和列信息存储在整数值中:

int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
Excel.Range cell = null;
for (int iRow = 1; iRow < rowCount; iRow++)
{
    for (int iCol = 1; iCol <= colCount; iCol++)
    {
        /* This line of code is probably wrong */
        cell = xlRange.Cells[iRow, iCol] as Excel.Range;
        if(/*Cell contains PivotTable*/)
        {
            int rowLocation = iRow;
            int colLocation = iCol;
        }
    }
}

我尝试查看 MSDN 和其他来源,但似乎找不到任何方法来检测单元格是否包含数据透视表。

任何帮助不胜感激,谢谢。

使用 Interop c# 检测 Excel Microsoft中的数据透视表

下面是一些代码供参考。标识工作表中数据透视表占用的总体区域,并验证单元格是否为区域的一部分。

private Excel.Range IdentifyPivotRanges(Excel.Range xlRange)
{
    Excel.Range pivotRanges = null;
    Excel.PivotTables pivotTables = xlRange.Worksheet.PivotTables();
    int pivotCount = pivotTables.Count;
    for (int i = 1; i <= pivotCount; i++)
    {
        Excel.Range tmpRange = xlRange.Worksheet.PivotTables(i).TableRange2;
        if (pivotRanges == null) pivotRanges = tmpRange;
        pivotRanges = this.Application.Union(pivotRanges, tmpRange);
    }
    return pivotRanges;
}
private void CheckCellsForPivot(Excel.Range xlRange)
{
    Excel.Range pivotRange = IdentifyPivotRanges(xlRange);
    int rowCount = xlRange.Rows.Count;
    int colCount = xlRange.Columns.Count;
    for (int iRow = 1; iRow <= rowCount; iRow++)
    {
        for (int iCol = 1; iCol <= colCount; iCol++)
        {
            var cell = xlRange.Cells[iRow, iCol];
            if (Application.Intersect(pivotRange, cell) != null)
            {
                int rowLocation = iRow;
                int colLocation = iCol;
            }
        }
    }
}

看看这里有几个关于循环浏览数据透视表列表的示例

pivotSheet.Activate();
Microsoft.Office.Interop.Excel.PivotTables pivotTables = 
        (Microsoft.Office.Interop.Excel.PivotTables)pivotSheet.PivotTables(missing);
int pivotTablesCount = pivotTables.Count;

从 C# 刷新 Excel 数据透视表

扩展 CS 的答案:我使用了 CS 的答案,但进行了一些修改,因此您所需要的只是通往 WorkBook 的路径。 不需要范围,只需在工作簿中传递工作表即可。

#region PivotTables
public static List<DataTable> PivotCollection(string filePath)
{
    List<DataTable> pivotCollection = new List<DataTable>();
    //Get Workbook
    xl.Application app = new xl.Application();
    xl.Workbook wb = null;
    wb = app.Workbooks.Open(filePath);
    //Loop through each worksheet and find pivot tables to add to collection
    foreach (xl.Worksheet ws in wb.Worksheets)
    {
        //Get range of pivot table
        string wsName = ws.Name.ToString();
        xl.Range pivotRange = GetPivotRange(ws);
        //Check if there is any table to add
        if (pivotRange == null) continue;
        DataTable pivotTable = DataTables.FromRange(pivotRange);
        //Get info from range and add to pivot
        pivotCollection.Add(pivotTable);
    }
    return pivotCollection;
}
//Find Pivot table in worksheet
//CS's Code with slight modification, use worksheet instead of range
public static xl.Range GetPivotRange(xl.Worksheet xlworkSheet)
{
    xl.Range pivotRanges = null;
    xl.PivotTables pivotTables = xlworkSheet.PivotTables();
    int pivotCount = pivotTables.Count;
    for (int i = 1; i <= pivotCount; i++)
    {
        xl.Range tmpRange = xlworkSheet.PivotTables(i).TableRange2;
        if (pivotRanges == null) pivotRanges = tmpRange;
        pivotRanges = tmpRange;
    }
    return pivotRanges;
}
#endregion