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

本文关键字:工作 互操作 Excel 何复制 复制 | 更新日期: 2023-09-27 18:31:05

我想简单地在我的工作簿中复制一张纸并给它一个不同的名称。

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

理想情况下,我希望能够编写这样的方法

pointName1.CopyTo("New Sheet");

其中"新工作表"是"PointName1"的重命名副本。

有时 PointName1 将是工作簿中唯一的工作表,有时还会有其他工作表。

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

您可以通过多种方式实现此目的 - 可能最简单的方法是在最后一个工作表之后复制,然后使用索引重命名它:

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 指南也回答了你的问题。

如果要获取工作表的索引,请查找Worksheet.Index属性。

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

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

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

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

编辑:

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

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

好吧,这里提到的其他解决方案对我不起作用。我得到了这个解决方案。

第 1 步:创建源文件的副本(即临时文件)

步骤 2:将所需的源文件工作表复制到临时文件

步骤 3:删除源文件

第 4 步:将临时文件重命名为源文件。

注意:您将需要来自 "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);
}

最简单的方法是在接受的答案中显示的最后一张纸之后复制它。

请注意,如果excel文件包含隐藏工作表,则副本将放置在可见工作表和隐藏工作表之间,因此隐藏工作表将被推到右侧。

如果您随后尝试使用xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET"设置名称,则最终将重命名最后一个隐藏工作表而不是新副本。

我设法通过访问新副本的名称来解决这个问题: xlWb.Sheets["_oldName_ (2)"].Name = "NEW SHEET" .

使您能够使用xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET"的其他修复是在复制所需工作表之前将所有工作表设置为可见。