如何复制具有不同名称的工作表 - C#和Excel Interop

时间:2014-11-18 21:55:12

标签: c# excel interop 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将是工作簿中唯一的工作表,有时会有其他工作表。

4 个答案:

答案 0 :(得分: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也会回答你的问题。

如果您想获取工作表的索引,请查找Worksheet.Index property

答案 1 :(得分:3)

您应该能够使用复制功能,但您无法在同一步骤中重命名工作表。 MSDN文档显示了其他参数:

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

从文档中: 如果未指定“之前”或“之后”,则Microsoft Office Excel将创建包含复制的工作表的新工作簿。

要重命名工作表,您需要获取对新工作表的引用(按索引或名称),并使用Name的{​​{1}}属性更改名称。

编辑:

如果您使用上述代码,则可以使用原始工作表的索引(因为您将原件放在原件之前):

worksheet

答案 2 :(得分: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"的其他修复方法是在复制所需的工作表之前设置所有工作表。

答案 3 :(得分:0)

嗯,这里提到的其他解决方案对我不起作用。我有这个解决方案。

步骤1:创建源文件(即TempFile)的副本

步骤2:将所需的源文件表复制到TempFile

步骤3:删除源文件

第4步::将TempFile重命名为Source File。

  

注意:您将需要来自以下位置的“ Microsoft.Office.Interop.Excel”包   Nuget用于此解决方案。另外,添加using Excel = Microsoft.Office.Interop.Excel;

static void Main(string[] args)
{
    Excel.Application excelApp;

    string sourceFileName = "Original.xlsx"; //Source excel file
    string tempFileName = "temp.xlsx";

    string folderPath = @"C:\FodlerPath\";

    string sourceFilePath = System.IO.Path.Combine(folderPath, sourceFileName);
    string destinationFilePath = System.IO.Path.Combine(folderPath, tempFileName);

    System.IO.File.Copy(sourceFilePath,destinationFilePath,true);

    /************************************************************************************/

    excelApp = new Excel.Application();
    Excel.Workbook wbSource, wbTarget;
    Excel.Worksheet currentSheet;

    wbSource = excelApp.Workbooks.Open(sourceFilePath);
    wbTarget = excelApp.Workbooks.Open(destinationFilePath); 

    currentSheet = wbSource.Worksheets["Sheet1"]; //Sheet which you want to copy
    currentSheet.Name = "TempSheet"; //Give a name to destination sheet

    currentSheet.Copy(wbTarget.Worksheets[1]); //Actual copy
    wbSource.Close(false);
    wbTarget.Close(true);
    excelApp.Quit();

    System.IO.File.Delete(sourceFilePath);
    System.IO.File.Move(destinationFilePath, sourceFilePath);
}