代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

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

  •  9
  • Sonny Boy  · 技术社区  · 14 年前

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

    这就是我目前为止所拥有的:

    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()时,它会将原始工作表中的所有工作表保存到新的工作表中。关于如何纠正这个问题有什么想法吗?

    事先谢谢,
    桑尼

    3 回复  |  直到 10 年前
        1
  •  13
  •   Slider345    14 年前

    您还可以使用sheet.copy()方法。

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

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

    //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()函数的引用: MSDN Link

        2
  •  4
  •   mortysporty    11 年前

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

    要多次填充模板工作表:

        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();
        }
    
        3
  •  1
  •   NickZucco    10 年前

    我想回答这个问题,即使问到这个问题已经一年多了。我自己在开发一个项目时也遇到了同样的问题,我花了一段时间才找到答案。我将使用vb.net代码而不是c发布,因为我不熟悉最后一个。

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

    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应用程序将同时显示两个工作簿,因此在复制完成后,如果您不想显示源工作簿(或至少不足以让用户执行任何操作),则应关闭源工作簿。

    xlApp.Workbooks(1).Close()
    

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

    我希望这仍然有一些价值。谨致问候。