【问题标题】:Excel Interop - Add a new worksheet after all of the othersExcel 互操作 - 在所有其他工作表之后添加一个新工作表
【发布时间】:2020-07-23 17:10:31
【问题描述】:

我正在尝试向 Excel 工作簿添加一个新工作表,并使其成为 C# Excel 互操作书中的最后一个工作表。

看起来很简单,我认为下面的代码可以做到:

using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var excel = new Excel.Application();

            var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx");
            workbook.Sheets.Add(After: workbook.Sheets.Count);

            workbook.Save();
            workbook.Close();

            Marshal.ReleaseComObject(excel);
        }
    }
}

没有这样的运气。我收到了这个有用的错误:

COMException 未处理 - 来自 HRESULT 的异常:0x800A03EC

我在 Microsoft.com 上找到了this page,它建议我先尝试添加工作表,然后再移动它,所以我尝试了如下所示。我知道这个网页的目标是 Excel 95,但 VBA 仍然可以使用,所以我希望它仍然可以工作:

using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var excel = new Excel.Application();

            var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx");
            workbook.Sheets.Add();
            workbook.Sheets.Move(After: workbook.Sheets.Count);

            workbook.Save();
            workbook.Close();

            Marshal.ReleaseComObject(excel);
        }
    }
}

我得到与上述相同的错误。我还尝试在 AddMove 方法中将上一个工作表的名称作为字符串作为 After 参数传递,不高兴!

这是我尝试过的,所以我的问题是如何使用 C# Excel Interop 将工作表添加到 Excel 工作簿并使其成为工作簿中的最后一个工作表?

谢谢

【问题讨论】:

  • JMK - 不是您的问题的答案,但可能是对 c# 和 excel 的有用指针。我已经使用 LinqToExcel 库已经有一段时间了,并且真的无法表达与使用互操作方法相比,它的体验有多干净。如果你有时间,看看它是否符合你的要求。 github.com/paulyoder/LinqToExcel 还有code.google.com/p/linqtoexcel
  • @jimtollan 感谢您的提醒,我将重点检查 LinqToExcel,它看起来不错。谢谢!

标签: c# excel interop


【解决方案1】:

查看http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.move(v=vs.80).aspx这里的文档,它表明'after'对象不是数字位置;它是代表您想要放置工作表的工作表的对象。代码可能应该类似于(未经测试):

workbook.Sheets.Add(After: workbook.Sheets[workbook.Sheets.Count]); 

【讨论】:

  • 这不能作为Move 方法的参数,但它确实可以作为Add 方法的参数!非常感谢!
  • 现在已经测试过了。这很有意义。就像您说的那样,新工作表不是在数字之后插入,而是在位于该编号位置的工作表之后(Excel 的基数为 1)。
  • 如果它是 XLSM 文件,我在 Add() 调用中遇到了 COMException。
【解决方案2】:

这应该可以完成工作:

wSheet.Move(Missing.Value, workbook.Sheets[workbook.Sheets.Count]);

【讨论】:

    【解决方案3】:

    这是唯一适合我的方法:

    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.Add
        (System.Reflection.Missing.Value,
         xlWorkBook.Worksheets[xlWorkBook.Worksheets.Count], 
         System.Reflection.Missing.Value, 
         System.Reflection.Missing.Value);
    

    【讨论】:

      【解决方案4】:

      对我有用

      WorkBook.Worksheets.Add(
          System.Reflection.Missing.Value,
          WorkBook.Worksheets[WorkBook.Worksheets.Count], 
          1, 
          System.Reflection.Missing.Value);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2017-03-17
        • 1970-01-01
        相关资源
        最近更新 更多