以编程方式删除Excel工作表

7

我有一个包含许多工作表的Excel工作簿。我想要删除除其中三个以外的所有工作表。

具体而言,我想知道是否有一种方法可以使用工作表名称而不是序号(工作表编号)来删除工作表。

我正在使用Excel Interop和C#与Excel进行交互。

Microsoft.Office.Interop.Excel.Application xlApp = null;
Excel.Workbook xlWorkbook = null;
Excel.Sheets xlSheets = null;
Excel.Worksheet xlNewSheet = null;
3个回答

11
xlApp.DisplayAlerts = false;
for (int i = xlApp.ActiveWorkbook.Worksheets.Count; i > 0 ; i--)
{
    Worksheet wkSheet = (Worksheet)xlApp.ActiveWorkbook.Worksheets[i];
    if (wkSheet.Name == "NameOfSheetToDelete")
    {
        wkSheet.Delete();
    }
}
xlApp.DisplayAlerts = true;

2
这是错误的,我认为。你不应该向上遍历循环,因为你正在从工作表集合内部删除。for (int i = WorkSheets.Count; i > 1; i--) - Ken White
2
不是 C# 专家,但 xlApp.DisplayAlerts = false 等应该放在循环外面。 - brettdj
1
根据@KenWhite的评论,是的,在删除时必须向后循环,否则您将最终得到一个超出界限的“i” - 如果您甚至删除了一个工作表,那么您将永远无法到达.Worksheets.Count,因为在那个时候,该工作表索引已不再存在于“Sheets”集合中。否则,您可以进行“对于每个wksheet”的循环,并根据工作表的.Name进行删除。 - David Zemens
@KenWhite 我将 for 循环改成了递减,但请注意这里的代码只删除一个工作表,因此循环的方向并不重要。xlApp.DisplayAlerts = false 也是一样的,它永远不会被调用多次,因此将其放在循环外并没有实质性的区别 - 但我还是这样做了... - Jeremy Thompson
@JeremyThompson 它被调用了多次。我想删除除其中三个之外的**所有**工作表 - brettdj
@brettdj我看到了,但我认为真正的问题是“具体来说”,是否有一种方法可以通过工作表名称删除工作表。干杯:) - Jeremy Thompson

2
我知道这已经过时了,但我刚刚使用以下代码: workBook.Sheets["Sheet1"].Delete(); 它可以删除工作簿中的“Sheet1”工作表。

1

我知道这个帖子非常老了,但对于未来的访问者,如果你知道要删除的表格的名称,更好的方法是像这样循环遍历表格的名称:

Workbook book = excelApp.Workbooks.Open("filePathHere");
string[] sheetsToDelete = {"s1", "s2"};
excelApp.DisplayAlerts = false; 
foreach(string sheetToDelete in sheetsToDelete )
{
    book.Worksheets[sheetToDelete].Delete();
}
excelApp.DisplayAlerts = true;

在迭代集合时,避免删除其中的元素是一个好习惯。


这是很好的建议。 - Timothy Stepanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接