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

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

问题描述:

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

这是我到目前为止有:

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(),这样可以节省一切从工作表原始工作簿放入新的工作簿中。任何想法如何纠正?

由于提前,
桑尼

您也可以使用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]; 

下面是复制()函数的引用,以及: MSDN Link

我意识到这是虽然有点迟了,但我在这方面挣扎很多,所以我想我会发布我的解决方案,以便它可以帮助其他人解决这个问题。

有你要填写很多次模板片:

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(); 
    } 

我想给这个问题的答案,甚至认为这是一年多以来有人问。我自己也遇到了同样的问题,我正在开发一个项目,花了我一段时间才找到答案。我将使用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 

在这种情况下,我使用的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() 

这是我能做到这一点,用户将看到一个闪烁的新工作簿坡平了,然后关闭,这是不是很整洁,但到目前为止,我不知道怎么回事做到这一点(或以不可见的方式执行此复制过程)

我希望这仍然有一定的价值。最好的祝福。