2010-09-27 189 views
8

我需要將工作表從一個工作簿複製到另一個工作表,並且我有點卡住了。前提是我有一個「主」工作簿,用於存儲多個報表的模板,然後需要創建特定工作表的空白副本並將其添加到新的工作簿中。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(),這樣可以節省一切從工作表原始工作簿放入新的工作簿中。任何想法如何糾正?

由於提前,
桑尼

回答

13

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

3

我意識到這是雖然有點遲了,但我在這方面掙扎很多,所以我想我會發布我的解決方案,以便它可以幫助其他人解決這個問題。

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

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

我想給這個問題的答案,甚至認爲這是一年多以來有人問。我自己也遇到了同樣的問題,我正在開發一個項目,花了我一段時間才找到答案。我將使用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() 

這是我能做到這一點,用戶將看到一個閃爍的新工作簿坡平了,然後關閉,這是不是很整潔,但到目前爲止,我不知道怎麼回事做到這一點(或以不可見的方式執行此複製過程)

我希望這仍然有一定的價值。最好的祝福。

相關問題