2014-11-18 21 views
5

Vorrei semplicemente copiare un foglio all'interno della cartella di lavoro e dargli un nome diverso.Come copiare un foglio con un nome diverso - C# ed Excel Interop

var pointName1 = workbook.Worksheets["PointName1"] as Worksheet; 
pointName1.Copy(); // How do I access this newly created sheet? 

Idealmente mi piacerebbe essere in grado di scrivere un metodo come questo

pointName1.CopyTo("New Sheet");

dove 'Nuovo Foglio' è una copia rinominata del 'PointName1'.

A volte PointName1 sarà l'unico foglio nella cartella di lavoro, altre volte ce ne saranno altri.

+0

possibile duplicato di [C# - Come copiare un singolo foglio di lavoro Excel da una cartella di lavoro a un'altra?] (Http://stackoverflow.com/questions/3808368/c-sharp-how-to-copy-a-single- excel-foglio di lavoro-da-una-cartella di lavoro-a-altro) – MethodMan

+0

@DJKRAZE Ho bisogno di copiare all'interno della stessa cartella di lavoro.Il link che hai fornito (insieme alla maggior parte degli altri su SO) riguarda la copia in una nuova cartella di lavoro. –

risposta

7

È possibile raggiungere questo obiettivo in più modi - probabilmente il modo più semplice è quello di copiare dopo l'ultimo foglio e poi rinominarlo utilizzando l'indice:

Excel.Application xlApp = Marshal.GetActiveObject("Excel.Application") as Excel.Application; 
Excel.Workbook xlWb = xlApp.ActiveWorkbook as Excel.Workbook; 
Excel.Worksheet xlSht = xlWb.Sheets[1]; 
xlSht.Copy(Type.Missing, xlWb.Sheets[xlWb.Sheets.Count]); // copy 
xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET";  // rename 

credo che questo MSDN guide risponde anche la vostra QUESTI sopra.

Se si desidera ottenere l'indice di un foglio, cercare Worksheet.Index property.

3

Dovresti essere in grado di utilizzare la funzione Copia, ma non sarai in grado di rinominare il foglio nello stesso passaggio. La documentazione MSDN mostra i parametri aggiuntivi:

pointName1.Copy(pointName1, Type.Missing); //Place a copy before the existing sheet 

Dalla documentazione: Se non si specifica né prima né dopo, Microsoft Office Excel crea una nuova cartella di lavoro che contiene il foglio copiato.

Per rinominare il foglio, è necessario ottenere un riferimento al nuovo foglio (per nome o indice) e utilizzare la proprietà Name di worksheet per modificare il nome.

EDIT:

Se si utilizza il codice di cui sopra è possibile utilizzare l'indice del foglio originale (dal momento che si sta posizionando la copia prima che l'originale):

int index = pointName1.Index; 
pointName1.Copy(pointName1, Type.Missing); 
Worksheet newWS = (Worksheet)xlApp.Worksheets[index]; 
+0

Vorrei copiare nello stesso foglio, non creare una nuova cartella di lavoro. Come posso ottenere in modo affidabile un riferimento al foglio appena creato nella stessa cartella di lavoro? –

+0

@JoeBauer Questo codice lo copia nello stesso blocco note. La riga della documentazione è lì per mostrarti perché il. Per quanto riguarda l'indice, se si utilizza il codice sopra l'indice sarà uguale al foglio originale poiché tale codice viene inserito prima. – MikeH

+0

@JoeBauer Modifica apportata – MikeH

0

Il modo più semplice è quello di copiarlo dopo l'ultimo foglio come presentato nella risposta accettata.

Si noti che se il file di Excel contiene fogli nascosti, la copia verrà posizionata tra i fogli visibili e quelli nascosti, pertanto i fogli nascosti verranno spostati a destra.

Se si tenta di impostare il nome con xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET", si rinuncerà a rinominare l'ultimo foglio nascosto anziché la nuova copia.

Sono riuscito a aggirare questo accedendo alla nuova copia dal suo nome: xlWb.Sheets["_oldName_ (2)"].Name = "NEW SHEET".

Un'altra correzione che consente di utilizzare xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET" è quella di impostare tutti i fogli visibili prima di copiare il foglio desiderato.

Problemi correlati