【问题标题】:Refreshing an Excel Pivot table from C#从 C# 刷新 Excel 数据透视表
【发布时间】:2019-11-12 21:53:23
【问题描述】:

我正在尝试刷新 Excel 工作表中的数据透视表并得到以下异常:

Item method in the PivotTables class failed

代码如下:

pivotSheet.Activate();
Microsoft.Office.Interop.Excel.PivotTables pivotTables = 
        (Microsoft.Office.Interop.Excel.PivotTables)pivotSheet.PivotTables(missing);
int pivotTablesCount = pivotTables.Count;  
    if (pivotTablesCount > 0)
    {
        for (int i = 0; i <= pivotTablesCount; i++)
        {
            pivotTables.Item(i).RefreshTable(); //The Item method throws an exception
        }
    }

有什么想法吗?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    假设索引从零开始,您的循环将超出集合。

    试试:

    for (int i = 0; i < pivotTablesCount; i++)
    

    如果这不起作用,Excel 可能会从 1 而不是 0 开始索引。

    试试:

    for (int i = 1; i <= pivotTablesCount; i++)
    

    【讨论】:

    • 从 i = 1 开始。成功了。我认为 excel 中的索引从 1 而不是 0 开始。
    • 嗨,Richard,我知道您的帖子是 5 年前发布的,但我目前有一个关于数据透视表领域的问题,因此想知道您是否可以快速浏览一下?任何帮助将不胜感激,谢谢:stackoverflow.com/questions/35623752/…
    • @Alex 当然我会看看,这个答案看起来很有希望:stackoverflow.com/a/35631705/467720
    • @RichardSmith 谢谢理查德,你是对的,它解决了我的问题,非常感谢
    【解决方案2】:

    这将帮助您正常工作。

    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
            }
        }
    }     
     
    

    【讨论】:

      【解决方案3】:
      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);
          }
      

      使用 Excel 添加 = Microsoft.Office.Interop.Excel;在使用中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-30
        • 2015-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 2016-09-07
        相关资源
        最近更新 更多