C# 删除Excel 2007工作簿中的所有查询表

C# 删除Excel 2007工作簿中的所有查询表,c#,excel,interop,C#,Excel,Interop,使用Excel互操作,我试图循环遍历所有工作表中的所有查询表并删除它们。我有一个代码,它是有效的: > // loop through each Worksheet > for (int i = 1; i <= workbook.Sheets.Count; i++) > { > sheet = (Worksheet)workbook.Sheets.get_Item(i); > > // loop through each queryTa

使用Excel互操作,我试图循环遍历所有工作表中的所有查询表并删除它们。我有一个代码,它是有效的:

> // loop through each Worksheet
> for (int i = 1; i <= workbook.Sheets.Count; i++)
> {
>     sheet = (Worksheet)workbook.Sheets.get_Item(i);
> 
>     // loop through each queryTable on each Worksheet
>     int queryTableCount = sheet.QueryTables.Count;
>     for (int j = 1; j <= queryTableCount; j++) {
>        sheet.QueryTables.Item(1).Delete();
>     }
> }
//循环浏览每个工作表
>对于(int i=1;i{
>工作表=(工作表)工作簿。工作表。获取项目(i);
> 
>//循环遍历每个工作表上的每个查询表
>int queryTableCount=sheet.QueryTables.Count;
>对于(int j=1;j sheet.QueryTables.Item(1).Delete();
>     }
> }

这对于某些数据连接/文件来说效果很好,但对于其他数据连接/文件,“QueryTables.Count”返回零-尽管我知道存在连接。这些连接是在Excel 2007中通过Microsoft Query中的“数据”选项卡-->从其他来源-->创建的。有人遇到过这个问题吗?

我解决了这个问题,因为Excel Interop在2003和2007版本的Exc中处理查询表的方式不同el.2007使用ListObjects,因此使用相同的代码循环遍历每个工作表,如上文所述,但随后使用:

// loop through each list object on each Worksheet
if (sheet.ListObjects.Count > 0)
{
   foreach (ListObject obj in sheet.ListObjects)
   {
     obj.QueryTable.Delete();
   }
}

我发现了这个问题,因为Excel Interop在2003版和2007版的Excel中处理查询表的方式不同。2007使用ListObjects,所以使用相同的代码在每个工作表中循环,如上所述,但使用:

// loop through each list object on each Worksheet
if (sheet.ListObjects.Count > 0)
{
   foreach (ListObject obj in sheet.ListObjects)
   {
     obj.QueryTable.Delete();
   }
}

在VBA中处理它们的方式似乎也不同。枚举Listobjects在那里也很有效。在VBA中处理它们的方式似乎也不同。枚举Listobjects在那里也很有效。