2014-11-18 18 views
5

Chciałbym po prostu skopiować jeden arkusz do mojego skoroszytu i nadać mu inną nazwę.Jak skopiować arkusz o innej nazwie - C# i Excel Interop

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

Idealnie chciałabym móc napisać metodę jak to

pointName1.CopyTo("New Sheet");

gdzie „Nowy arkusz” jest przemianowany kopia „PointName1”.

Czasami PointName1 będzie jedynym arkuszem w skoroszycie, innym razem będą inne.

+0

możliwy duplikat [C# - Jak skopiować pojedynczy arkusz Excel z jednego skoroszytu do drugiego?] (Http://stackoverflow.com/questions/3808368/c-sharp-how-to-copy-a-single- excel-worksheet-from-one-workbook-to the another) – MethodMan

+0

@DJKRAZE Potrzebuję skopiować w tym samym skoroszycie.Podany link (wraz z większością innych elementów SO) dotyczy kopiowania do nowego skoroszytu. –

Odpowiedz

7

Można to osiągnąć w wiele sposobów - prawdopodobnie najprostszym sposobem jest skopiowanie po ostatnim arkusza, a następnie zmień jego nazwę za pomocą indeksu:

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 

wierzę to MSDN guide odpowiada również swoją questi na.

Jeśli chcesz uzyskać indeks arkusza, sprawdź numer Worksheet.Index property.

3

Powinieneś być w stanie korzystać z funkcji kopiowania, ale nie będziesz w stanie zmienić nazwy arkusza w tym samym kroku. Dokumentacja MSDN przedstawia dodatkowe parametry:

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

Z dokumentacji: Jeśli nie określić przed lub po, Microsoft Office Excel utworzy nowy skoroszyt zawierający skopiowany arkusz.

Aby zmienić nazwę arkusza, należy uzyskać odniesienie do nowego arkusza (według indeksu lub nazwy) i zmienić jego nazwę za pomocą właściwości Name pod numerem worksheet.

EDIT:

Jeśli używasz powyższy kod można użyć indeksu oryginalnego arkusza (ponieważ jesteś umieszczenie kopii przed pierwotnym):

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

Chciałbym skopiować do tego samego arkusza, nie tworzyć nowy skoroszyt. Jak mogę niezawodnie uzyskać odniesienie do nowo utworzonego arkusza w tym samym skoroszycie? –

+0

@JoeBauer Ten kod kopiuje go do tego samego notebooka. Linia z dokumentacji jest po to, aby pokazać, dlaczego. Jeśli chodzi o indeks, jeśli użyjesz powyższego kodu, indeks będzie taki sam jak oryginalny arkusz, ponieważ ten kod wstawia się wcześniej. – MikeH

+0

@JoeBauer Edytuj wykonane – MikeH

0

Najprostszym sposobem jest skopiowanie go po ostatnim arkuszu przedstawionym w zaakceptowanej odpowiedzi.

Należy pamiętać, że jeśli plik Excela zawiera ukryte arkusze, kopia zostanie umieszczona między widocznymi arkuszami a ukrytymi, dlatego ukryte arkusze zostaną przesunięte w prawo.

Jeśli spróbujesz ustawić nazwę na xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET", zmienisz nazwę swojego ostatniego ukrytego arkusza zamiast nowej kopii.

Udało mi się to obejść, uzyskując dostęp do nowej kopii według jej nazwy: xlWb.Sheets["_oldName_ (2)"].Name = "NEW SHEET".

Inną poprawką, która umożliwia korzystanie z xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET", jest ustawienie wszystkich arkuszy widocznych przed skopiowaniem wybranego arkusza.