I am trying to refresh a pivot table in an Excel sheet and get the following exception:
Item method in the PivotTables class failed
Heres t
Assuming the indexing starts at zero you will overrun the collection with your loop.
Try:
for (int i = 0; i < pivotTablesCount; i++)
If that doesn't work Excel probably starts indexing at 1 not at 0.
Try:
for (int i = 1; i <= pivotTablesCount; i++)
This will help you it's working.
Microsoft.Office.Interop.Excel.Application oXL;
Microsoft.Office.Interop.Excel.Workbook mWorkBook;
Microsoft.Office.Interop.Excel.Sheets mWorkSheets;
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = true;
oXL.DisplayAlerts = false;
mWorkBook = oXL.Workbooks.Open(path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
//Get all the sheets in the workbook
mWorkSheets = mWorkBook.Worksheets;
foreach (Microsoft.Office.Interop.Excel.Worksheet pivotSheet in mWorkSheets)
{
Microsoft.Office.Interop.Excel.PivotTables pivotTables = pivotSheet.PivotTables();
int pivotTablesCount = pivotTables.Count;
if (pivotTablesCount > 0)
{
for (int i = 1; i <= pivotTablesCount; i++)
{
pivotTables.Item(i).RefreshTable(); //The Item method throws an exception
}
}
}
private void RefreshSheets(string filePath)
{
Excel.Application xlApp = new Excel.Application();
Excel.Workbooks xlWorkbooks = xlApp.Workbooks;
Excel.Workbook xlWorkbook = xlWorkbooks.Open(filePath);
foreach (Excel.Worksheet xlworksheet in xlWorkbook.Worksheets)
{
Excel.PivotTables pivotTbls = (Excel.PivotTables)xlworksheet.PivotTables(Type.Missing);
if (pivotTbls.Count > 0)
{
for (int i = 1; i <= pivotTbls.Count; j++)
{
pivotTbls.Item(i).RefreshTable();
}
}
}
xlWorkbook.Save();
GC.Collect();
GC.WaitForPendingFinalizers();
xlWorkbook.Close(0);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlWorkbooks);
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
}
Add using Excel = Microsoft.Office.Interop.Excel; in using