C#-如何将单个Excel工作表从一个工作簿复制到另一个工作簿?

C#-如何将单个Excel工作表从一个工作簿复制到另一个工作簿?,c#,excel,interop,C#,Excel,Interop,我需要将工作表从一个工作簿复制到另一个工作簿,我有点卡住了。前提是我有一个“主”工作簿,其中存储了许多报告的模板,然后我需要创建一个特定工作表的空白副本,并将其添加到新工作簿中 Private Sub ThisWorkbook_Startup() Handles Me.Startup Me.Application.Workbooks.Open(filePath) Me.Application.Workbooks(2).Worksheets("Reporte"). _

我需要将工作表从一个工作簿复制到另一个工作簿,我有点卡住了。前提是我有一个“主”工作簿,其中存储了许多报告的模板,然后我需要创建一个特定工作表的空白副本,并将其添加到新工作簿中

Private Sub ThisWorkbook_Startup() Handles Me.Startup
    Me.Application.Workbooks.Open(filePath)
    Me.Application.Workbooks(2).Worksheets("Reporte"). _
          Copy(After:=Me.Application.Workbooks(1).Worksheets("Hoja1"))
    Me.Application.Workbooks(2).Close()
    Me.Application.DisplayAlerts = False
    Globals.Hoja1.Delete()
    Me.Application.DisplayAlerts = True
End Sub
这就是我到目前为止所做的:

private void CreateNewWorkbook(Tables table)
{
    Excel.Application app = null;
    Excel.Workbook book = null;
    Excel.Worksheet sheet = null;

    try
    {
        string startPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
        string filePath = System.IO.Path.Combine(startPath, "sal1011forms.xls");
        Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();

        app = new Excel.Application();
        book = app.Workbooks.Open(filePath);
        sheet = (Excel.Worksheet)book.Worksheets.get_Item((int)table + 1);

        sfd.AddExtension = true;
        sfd.FileName = table.ToString() + ".xls";
        sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

        if (sfd.ShowDialog() == true)
        {
            sheet.SaveAs(sfd.FileName);
        }
    }
    finally
    {
        if (book != null)
        {
            book.Close();
        }
        if (app != null)
        {
            app.Quit();
        }
        this.ReleaseObject(sheet);
        this.ReleaseObject(book);
        this.ReleaseObject(app);
    }
}
目前唯一的问题是,当我在工作表上调用.Save()时,它会将原始工作簿中的所有工作表保存到新工作簿中。关于如何纠正这个问题有什么想法吗

提前感谢,

Sonny

您也可以使用
Sheet.Copy()
方法

基本上,
Sheet.copy
复制工作表,同时自动创建新工作簿

在调用
工作表后,尝试将以下行添加到代码中。获取\u项目

// Copies sheet and puts the copy into a new workbook
sheet.Copy(Type.Missing, Type.Missing);

// Sets the sheet variable to the copied sheet in the new workbook
sheet = app.Workbooks[2].Sheets[1];
下面是
Copy()
函数的参考:

我意识到这是一个有点晚的回复,但我对此有点纠结,所以我想我应该发布我的解决方案,以便它可以帮助其他人解决这个问题

要多次填写模板工作表:

    public void test()
    {

        Excel.Application excelApp;

        string fileTarget = "C:\target.xlsx";
        string fileTemplate = "C:\template.xlsx";
        excelApp = new Excel.Application();
        Excel.Workbook wbTemp, wbTarget;
        Excel.Worksheet sh;

        //Create target workbook
        wbTarget = excelApp.Workbooks.Open(fileTemplate);

        //Fill target workbook
        //Open the template sheet
        sh = wbTarget.Worksheets["TEMPLATE"];
        //Fill in some data
        sh.Cells[1, 1] = "HELLO WORLD!";
        //Rename sheet
        sh.Name = "1. SHEET";


        //Save file
        wbTarget.SaveAs(fileTarget);

        //Iterate through the rest of the files
        for (int i = 1; i < 3; i++)
        {
            //Open template file in temporary workbook
            wbTemp = excelApp.Workbooks.Open(fileTemplate);

            //Fill temporary workbook
            //Open the template sheet
            sh = wbTemp.Worksheets["TEMPLATE"];
            //Fill in some data
            sh.Cells[1, 1] = "HELLO WORLD! FOR THE " + i + ".TH TIME";
            //Rename sheet
            sh.Name = i + ". SHEET";

            //Copy sheet to target workbook
            sh.Copy(wbTarget.Worksheets[1]);
            //Close temporary workbook without saving
            wbTemp.Close(false);
        }

        //Close and save target workbook
        wbTarget.Close(true);
        //Kill excelapp
        excelApp.Quit();
    }
公共无效测试()
{
Excel.applicationexcelapp;
string fileTarget=“C:\target.xlsx”;
string fileTemplate=“C:\template.xlsx”;
excelApp=新的Excel.Application();
Excel.工作簿wbTemp,wbTarget;
Excel.sh工作表;
//创建目标工作簿
wbTarget=excelApp.Workbooks.Open(文件模板);
//填写目标工作簿
//打开模板工作表
sh=wbTarget.Worksheets[“模板”];
//填写一些数据
sh.Cells[1,1]=“你好,世界!”;
//重命名工作表
sh.Name=“1.SHEET”;
//保存文件
wbTarget.SaveAs(fileTarget);
//遍历其余的文件
对于(int i=1;i<3;i++)
{
//在临时工作簿中打开模板文件
wbTemp=excelApp.Workbooks.Open(文件模板);
//填写临时工作簿
//打开模板工作表
sh=wbTemp.工作表[“模板”];
//填写一些数据
sh.Cells[1,1]=“你好,世界!第“+i+”。次”;
//重命名工作表
sh.Name=i+“.SHEET”;
//将工作表复制到目标工作簿
sh.Copy(wbTarget.Worksheets[1]);
//关闭临时工作簿而不保存
wbTemp.Close(假);
}
//关闭并保存目标工作簿
wbTarget.Close(真);
//杀死excelapp
excelApp.Quit();
}

我想对这个问题给出一个答案,尽管它已经被问了一年多了。我自己在开发一个项目时也遇到了同样的问题,我花了一段时间才找到答案。我将使用VB.NET代码而不是C#发布,因为我不熟悉上一篇文章

这里是交易,为了在Excel工作簿之间复制工作表,绝对有必要只使用一个Excel应用程序对象,然后使用该应用程序打开两个工作簿,然后我们可以使用已知的Worker.copy方法,只需指定在另一个工作簿中的工作表之后或之前复制工作表

Private Sub ThisWorkbook_Startup() Handles Me.Startup
    Me.Application.Workbooks.Open(filePath)
    Me.Application.Workbooks(2).Worksheets("Reporte"). _
          Copy(After:=Me.Application.Workbooks(1).Worksheets("Hoja1"))
    Me.Application.Workbooks(2).Close()
    Me.Application.DisplayAlerts = False
    Globals.Hoja1.Delete()
    Me.Application.DisplayAlerts = True
End Sub
在本例中,我使用的Excel应用程序是运行我的Excel工作簿项目的应用程序,但这也可以:

Dim xlApp As New Excel.Application
Dim book1 As Excel.Workbook
Dim book2 As Excel.Workbook
book1 = xlApp.Workbooks.Open(filePath1)
book2 = xlApp.Workbooks.Open(filePath2)

book1.Worksheets("Sheet to be copied").Copy(After:=book2.Worksheets(1))
当然,Excel应用程序将同时显示这两个工作簿,因此在完成复制后,如果您不想显示源工作簿(或者至少不想让用户做任何事情),则应关闭源工作簿

这是我可以做到的,用户将看到一个闪烁的新工作簿弹出,然后关闭,这不是真的整洁,但到目前为止,我不知道如何做它(或以不可见的方式进行此复制过程)


我希望这仍然有一些价值。致以最诚挚的问候。

您好,您在脚本组件中使用了哪些引用?