Excel Interop - 在所有其他工作表之后添加一个新的工作表

41

我试图在 C# Excel Interop 中向工作簿添加一个新工作表,并将其设置为该工作簿中的最后一个工作表。

这似乎非常简单,我认为下面的代码可以实现:

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 was unhandled - Exception from HRESULT: 0x800A03EC

我在 Microsoft.com 上找到了这个页面,它建议我尝试先添加工作表,然后再移动它,所以我按照下面的示例尝试了一下。虽然该网页针对的是 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工作簿添加工作表,并使其成为工作簿中的最后一个工作表?

谢谢


2
JMK - 这不是解决您问题的答案,但也许对于C#和Excel会有所帮助。我已经使用LinqToExcel库相当长一段时间了,真的无法表达使用Interop方法论相比之下,它有多么清晰的体验。如果您有时间,请看看它是否符合您的要求。https://github.com/paulyoder/LinqToExcel 还有 http://code.google.com/p/linqtoexcel/ - jim tollan
1
@jimtollan 感谢您的提醒,我会特意去了解一下 LinqToExcel,它看起来很不错。谢谢! - JMK
4个回答

70

2
这个作为 Move 方法的参数不起作用,但是作为 Add 方法的参数却可以!非常感谢! - JMK
现在已经测试过了。这非常有意义。就像你所说的那样,新工作表并不是在数字后插入,而是在该数字位置上的工作表之后插入(Excel中的基数为1)。 - RPh_Coder
如果是XLSM文件,在Add()调用中我会收到一个COMException异常。 - David Thielen
完美的胜利 :D - Chandraprakash

8
这应该可以完成任务:
wSheet.Move(Missing.Value, workbook.Sheets[workbook.Sheets.Count]);

5
这是我唯一行之有效的方法:
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);

0

对我来说它有效

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

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