2014-11-18 3 views
5

Я хотел бы просто скопировать один лист в моей книге и дать ему другое имя.Как скопировать лист с другим именем - C# и Excel Interop

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

В идеале я хотел бы иметь возможность написать метод, как этот

pointName1.CopyTo("New Sheet");

где «Новый лист» является переименованной копией «PointName1».

Иногда PointName1 будет единственным листом в книге, в других случаях будут другие.

+0

Возможный дубликат [C# - Как скопировать один лист Excel из одной книги в другую?] (Http://stackoverflow.com/questions/3808368/c-sharp-how-to-copy-a-single- excel-worksheet-from-one-workbook-to-another) – MethodMan

+0

@DJKRAZE Мне нужно скопировать в ту же книгу.Ссылка, которую вы предоставили (наряду с большинством других в SO), связана с копированием в новую книгу. –

ответ

7

Вы можете достичь этого в несколько способов - вероятно, самый простой способ для копирования после последнего листа, а затем переименовать его с помощью индекса:

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 

Я считаю, что это MSDN guide также отвечает на ваш questi на.

Если вы хотите получить индекс листа, найдите Worksheet.Index property.

3

Вы должны иметь возможность использовать функцию копирования, но вы не сможете переименовать лист на том же шаге. В документации MSDN показаны дополнительные параметры:

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

Из документации: Если вы не укажете ни до, ни после, Microsoft Office Excel создает новую книгу, содержащую скопированный лист.

Чтобы переименовать лист, вам необходимо получить ссылку на новый лист (по индексу или имени) и использовать свойство Nameworksheet, чтобы изменить имя.

EDIT:

Если вы используете код выше вы можете использовать индекс исходного листа (так как вы размещение копии до оригинала):

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

Я хотел бы скопировать в тот же лист, а не создавать новую книгу. Как я могу надежно получить ссылку на вновь созданный лист в той же книге? –

+0

@JoeBauer Этот код копирует его в тот же ноутбук. Строка из документации есть, чтобы показать вам, почему. Что касается индекса, если вы используете код выше, индекс будет таким же, как и исходный лист, так как этот код вставляет раньше. – MikeH

+0

@JoeBauer Редактировать – MikeH

0

Самый простой способ - скопировать его после последнего листа, как представлено в принятом ответе.

Обратите внимание, что если файл Excel содержит скрытые листы, копия будет размещаться между видимыми листами и скрытыми, поэтому скрытые листы будут сдвинуты вправо.

Если вы затем попытаетесь установить имя с помощью xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET", вы в конечном итоге переименуете свой последний скрытый лист вместо своей новой копии.

Мне удалось обойти это, обратившись к новой копии по ее названию: xlWb.Sheets["_oldName_ (2)"].Name = "NEW SHEET".

Другие исправления, которые позволят вам использовать xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET", - это установить все листы, видимые перед копированием нужного листа.

Смежные вопросы