【问题标题】:How to copy a sheet with a different name - C# and Excel Interop如何复制具有不同名称的工作表 - C# 和 Excel 互操作
【发布时间】:2015-01-16 06:17:06
【问题描述】:

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

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 interop excel-interop


【解决方案1】:

您可以通过多种方式实现这一点 - 可能最简单的方法是在最后一张纸之后复制,然后使用索引重命名它:

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

【讨论】:

    【解决方案2】:

    您应该可以使用复制功能,但不能在同一步骤中重命名工作表。 MSDN 文档显示了附加参数:

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

    来自文档: 如果您未指定之前或之后,Microsoft Office Excel 会创建一个包含复制工作表的新工作簿。

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

    编辑:

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

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

    【讨论】:

    • 我想复制到同一张工作表,而不是创建一个新的工作簿。如何可靠地获得对同一工作簿中新创建工作表的引用?
    • @JoeBauer 此代码将其复制到同一个笔记本中。文档中的那一行是为了向您展示原因。至于索引,如果您使用上面的代码,索引将与原始工作表相同,因为该代码之前插入。
    【解决方案3】:

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

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

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

    第三步:删除源文件

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

    注意:您将需要来自 用于此解决方案的 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);
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2020-12-30
        • 2018-12-14
        • 1970-01-01
        相关资源
        最近更新 更多