2010-09-27 2 views
8

Ich habe ein Arbeitsblatt von einer Arbeitsmappe in eine andere kopieren müssen, und ich bin ein bisschen fest. Die Prämisse ist, dass ich eine "Master" Arbeitsmappe habe, die die Vorlagen für eine Reihe von Berichten speichert, und ich muss dann eine leere Kopie eines bestimmten Arbeitsblatts erstellen und es in einer neuen Arbeitsmappe hinzufügen.C# - Wie kopiert man ein einzelnes Excel-Arbeitsblatt von einer Arbeitsmappe in eine andere?

Dies ist, was ich bisher:

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

Das einzige Problem, das ich im Moment habe, ist, dass, wenn ich .Save() auf dem Arbeitsblatt aufrufen, es alle Arbeitsblätter aus der spart Originalarbeitsbuch in eine neue Arbeitsmappe. Irgendwelche Ideen, wie man das korrigiert?

Vielen Dank im Voraus,
Sonny

Antwort

13

Sie auch die Sheet.Copy() -Methode verwenden könnte.

Grundsätzlich kopiert Sheet.copy das Blatt und erstellt automatisch eine neue Arbeitsmappe zur selben Zeit.

Versuchen Sie, die folgenden Zeilen Code hinzufügen, nach dem Aufruf 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]; 

Hier ist die Referenz für die Copy() Funktion auch: MSDN Link

3

Ich weiß, dies ist eine etwas späte Antwort, aber ich habe mit diesem Problem ziemlich gerungen, also dachte ich mir, dass ich meine Lösung posten würde, damit es jemand anderem helfen könnte, dieses Problem zu haben.

Mit einem Vorlagenblatt Sie viele Male füllen wollen:

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

Ich mag würde eine Antwort auf diese Frage geben, auch, dass es mehr als ein Jahr, da er gefragt wurde. Ich hatte das selbe Problem mit einem Projekt, das ich gerade entwickle, und ich brauchte eine Weile, um die Antwort zu finden. Ich werde mit VB.NET-Code anstelle von C# veröffentlichen, da ich nicht mit dem letzten vertraut bin.

Hier ist der Deal, um Blätter zwischen Excel-Arbeitsmappen zu kopieren ist es absolut notwendig, nur ein Excel Application-Objekt zu verwenden und dann beide Arbeitsmappen mit dieser einzigen Anwendung zu öffnen, dann können wir die bekannte Worksheet.Copy-Methode und einfach verwenden Geben Sie an, dass das Blatt nach oder vor dem Blatt in dieser anderen Arbeitsmappe kopiert wird.

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 

In diesem Fall wird die Excel-Anwendung Ich verwende ist derjenige, der meine Excel-Arbeitsmappe Projekt läuft, aber das würde auch funktionieren:

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)) 

Natürlich wird die Excel-Anwendung beide Arbeitsmappen zeigen Nachdem Sie mit dem Kopieren fertig sind, sollten Sie die Quellarbeitsmappe schließen, wenn Sie sie nicht anzeigen möchten (oder zumindest nicht lange genug, damit der Benutzer etwas tun kann).

xlApp.Workbooks(1).Close() 

Dies ist die Art, wie ich es tun könnte, wird der Benutzer eine blinkende neue Arbeitsmappe sieht poping und schloß dann, was nicht wirklich ordentlich ist, aber bisher habe ich keine Ahnung, wie ich es sonst zu tun (oder Mach diesen Kopiervorgang in einer nicht sichtbaren Weise)

Ich hoffe, dass dies noch einen gewissen Wert hat. Freundliche Grüße.