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

Son*_*Boy 10 c# excel interop

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

这是我到目前为止:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在唯一的问题是,当我在工作表上调用.Save()时,它会将原始工作簿中的所有工作表保存到新工作簿中.有关如何纠正此问题的任何想法?

先谢谢,
桑尼

Sli*_*345 14

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

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

在调用Worksheets.get_Item之后,尝试将以下行添加到代码中:

//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];
Run Code Online (Sandbox Code Playgroud)

这里也是Copy()函数的参考: MSDN Link


mor*_*rty 6

我意识到这是一个比较晚的答复,但是我为此付出了很多努力,因此我认为我会发布解决方案,以便它可以帮助遇到此问题的其他人。

想要多次填写模板表:

    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();
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

尽管距离提出这个问题已有一年多了,但我还是想回答一下。我自己在开发的一个项目中也遇到了同样的问题,我花了一段时间才找到答案。我将使用 VB.NET 代码而不是 C# 进行发布,因为我对后者不熟悉。

事情是这样的,为了在 Excel 工作簿之间复制工作表,绝对有必要仅使用一个 Excel 应用程序对象,然后使用该单个应用程序打开两个工作簿,然后我们可以使用已知的 Worksheet.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
Run Code Online (Sandbox Code Playgroud)

在本例中,我使用的 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))
Run Code Online (Sandbox Code Playgroud)

当然,Excel 应用程序将显示两个工作簿,因此在完成复制后,如果您不想显示源工作簿(或者至少没有足够长的时间让用户执行任何操作),则应关闭源工作簿。

xlApp.Workbooks(1).Close()
Run Code Online (Sandbox Code Playgroud)

这就是我可以做到的方式,用户将看到一个闪烁的新工作簿弹出然后关闭,这并不是很整洁,但到目前为止我不知道还能怎么做(或者以非- 可见的方式)

我希望这仍然有一定的价值。此致。