I am trying to detect whether a cell in Microsoft excel contains a Pivot Table by using Microsoft Interop c#
What I want to do is loop through all of the cells as indicated in the code below, and then if the cell contains a pivot table, I want to store the row and column information of that cell in an integer value as such:
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;
}
}
}
I've tried looking at MSDN and other sources but can't seem to find any methods for detecting if a cell contains a pivot table.
Any help is appreciated, thanks.
Here is some code for reference. Identify the overall Range occupied by PivotTables in the sheet and validate whether the cell is a part of the Range.
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;
}
}
}
}
look here is got a couple of examples about looping through Pivot tables list
pivotSheet.Activate();
Microsoft.Office.Interop.Excel.PivotTables pivotTables =
(Microsoft.Office.Interop.Excel.PivotTables)pivotSheet.PivotTables(missing);
int pivotTablesCount = pivotTables.Count;
Expanding on CS's Answer: I used CS's answer but with some modification so that all you need is the path to your WorkBook. No range needed, just pass the worksheets within the 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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.