如何复制具有不同名称的工作表 - 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 将是工作簿中唯一的工作表,有时还会有其他工作表。
您可以通过多种方式实现此目的 - 可能最简单的方法是在最后一个工作表之后复制,然后使用索引重命名它:
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"
的其他修复是在复制所需工作表之前将所有工作表设置为可见。