C# .Net Excel互操作删除工作表

C# .Net Excel互操作删除工作表,c#,.net,excel,interop,C#,.net,Excel,Interop,我正在尝试使用interop excel类(适用于excel 2003)从.Net c#3.5应用程序的excel文档中删除工作表 我尝试了很多事情,比如: Worksheet worksheet = (Worksheet)workbook.Worksheets[1]; worksheet.Delete(); 它不工作,也不会抛出任何错误…经过一个多小时的查找,我找到了答案: xlApp.DisplayAlerts = false; worksheet.Delete(); xlApp.Disp

我正在尝试使用interop excel类(适用于excel 2003)从.Net c#3.5应用程序的excel文档中删除工作表

我尝试了很多事情,比如:

Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
worksheet.Delete();

它不工作,也不会抛出任何错误…

经过一个多小时的查找,我找到了答案:

xlApp.DisplayAlerts = false;
worksheet.Delete();
xlApp.DisplayAlerts = true;

还需要注意的是,工作簿必须至少包含一个工作表;这意味着您无法删除工作簿中的所有工作表。

在处理删除Excel工作表时,有两件重要的事情需要知道:

  • Excel互操作从1开始计数(而不是从零开始计数),因此,删除第二项将导致第三项取代它的位置!。因此,删除工作表的正确方法是从最后一张到第一张:

    // Remove LAST worksheet
    MyWorkBook.Worksheets[3].Delete();
    
    // and only then remove the second (which is the last one)
    MyWorkBook.Worksheets[2].Delete();
    
    或者,您可以删除列表中的第二项([2])两次,这将得到相同的结果

  • 当您只剩下一个工作表时,以下行将引发异常:

     MyWorkBook.Worksheets[1].Delete();
    

  • 尝试按名称查找工作表:

    var app = new Microsoft.Office.Interop.Excel.Application();
    var workbook = app.Workbooks.Add();
    ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets["Sheet3"]).Delete();
    

    我们从c#控制台应用程序中删除excel工作表,如下所示:

     Microsoft.Office.Interop.Excel.Worksheet worksheet = 
     (Worksheet)workbook.Worksheets["Worksheet_Name" (or) "Countings"];
     worksheet.Delete();
    

    我们可以像这样删除工作表

     Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
    
                    if (xlApp == null)
                    {
    
                        return;
                    }
    
    
                    xlApp.DisplayAlerts = false;
                    string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
                                            + "\\Sample.xlsx";
                    Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(filePath, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                    Excel.Sheets worksheets = xlWorkBook.Worksheets;
    
                    worksheets[4].Delete();
                    worksheets[3].Delete();
                    xlWorkBook.Save();
                    xlWorkBook.Close();
    
                    releaseObject(worksheets);
                    releaseObject(xlWorkBook);
                    releaseObject(xlApp);
    
    用这个

      static void releaseObject(object obj)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                    obj = null;
                }
                catch (Exception ex)
                {
                    obj = null;
                    throw ex;
    
                }
                finally
                {
                    GC.Collect();
                }
            }
    

    是的,这是正确的,如果你试图删除它们,你会得到一个COMException。谢谢-你为我节省了数小时的调试时间。“如果你删除第二张工作表,第三张工作表将取代她的位置……”这很明显,但也很容易忽略。你的答案并不能回答问题。如果索引错误,您将得到一个异常。但梅勒索斯写道,他没有得到任何例外。正确答案来自梅勒索斯本人。见下文。我太习惯于使用网络应用了!我忘记了在处理web表单时有时需要警报抑制,这很常见:)这与表单无关。这是Excel中的一个错误。如果将Excel.Application.Visible设置为false,则Excel在通过自动删除工作表时不应显示任何警报“关闭工作表时可能会丢失数据,Bla Bla”。在MS Excel 2013中,它会生成类似于
    工作表(“原始”)的宏。选择
    ActiveWindow.SelectedSheets.Delete
    ,将其转换为C#code,它不起作用,为什么?
      static void releaseObject(object obj)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                    obj = null;
                }
                catch (Exception ex)
                {
                    obj = null;
                    throw ex;
    
                }
                finally
                {
                    GC.Collect();
                }
            }