2010-09-27 17 views
8

Ho bisogno di copiare un foglio di lavoro da una cartella di lavoro a un'altra e sono un po 'bloccato. La premessa è che ho una cartella di lavoro "master" che memorizza i modelli per un numero di report e quindi ho bisogno di creare una copia vuota di un foglio di lavoro specifico e aggiungerla in una nuova cartella di lavoro.C# - Come copiare un singolo foglio di lavoro Excel da una cartella di lavoro a un'altra?

Questo è quello che ho finora:

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

L'unico problema che sto avendo in questo momento è che quando chiamo .save() sul foglio di lavoro, salva tutti i fogli dal cartella di lavoro originale in una nuova cartella di lavoro. qualche idea su come correggere questo?

Grazie in anticipo,
Sonny

risposta

13

Si potrebbe anche utilizzare il metodo Sheet.Copy().

Fondamentalmente, Foglio.copy copia il foglio e crea automaticamente una nuova cartella di lavoro allo stesso tempo.

Prova ad aggiungere le seguenti righe al codice, dopo la vostra chiamata a 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]; 

Ecco il riferimento per la funzione di copia() così: MSDN Link

3

Mi rendo conto che questo è una risposta un po 'tarda, ma ho faticato parecchio con questo, quindi ho pensato di pubblicare la mia soluzione in modo che potesse aiutare qualcun altro a risolvere questo problema.

Avere un foglio di modello che si desidera riempire molte volte:

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

Vorrei dare una risposta per questa domanda, anche che è più di un anno da quando è stato chiesto. Ho avuto lo stesso problema con un progetto che sto sviluppando, e mi ci è voluto un po 'per trovare la risposta. Pubblicherò usando il codice VB.NET invece di C# poiché non ho familiarità con l'ultimo.

Ecco l'operazione, per copiare fogli tra cartelle di lavoro Excel è assolutamente necessario utilizzare solo UN oggetto Excel Application e quindi aprire entrambe le cartelle di lavoro con quella singola applicazione, quindi è possibile utilizzare il metodo noto Worksheet.Copy e semplicemente specificare che il foglio viene copiato prima o dopo il foglio in quell'altra cartella di lavoro.

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 questo caso l'applicazione Excel sto usando è quella che gestisce il mio progetto cartella di lavoro Excel, ma questo sarebbe anche lavorare:

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

Naturalmente, l'applicazione Excel mostrerà entrambe le cartelle di lavoro quindi, una volta terminata la copia, è necessario chiudere la cartella di lavoro di origine se non si intende visualizzarla (o almeno non abbastanza a lungo affinché l'utente possa fare qualsiasi cosa).

xlApp.Workbooks(1).Close() 

Questo è il modo in cui avrei potuto farlo, l'utente vedrà un lampeggiante nuova cartella di lavoro poping up e poi la chiusura, che non è davvero bello, ma finora non ho idea di come altro a farlo (o fare questo processo di copia in modo non visibile)

Spero che questo abbia ancora un certo valore. I migliori saluti.

Problemi correlati