如何将一个Excel工作表从一个工作簿复制到另一个?

我有一个需要将工作表从一个工作簿复制到另一个工作表,我有点卡住了。 前提是我有一个“主”工作簿,用于存储多个报表的模板,然后需要创build特定工作表的空白副本并将其添加到新的工作簿中。

这是我迄今为止:

private void CreateNewWorkbook(Tables table) { Excel.Application app = null; Excel.Workbook book = null; Excel.Worksheet sheet = null; try { string startPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); string filePath = System.IO.Path.Combine(startPath, "sal1011forms.xls"); Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); app = new Excel.Application(); book = app.Workbooks.Open(filePath); sheet = (Excel.Worksheet)book.Worksheets.get_Item((int)table + 1); sfd.AddExtension = true; sfd.FileName = table.ToString() + ".xls"; sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (sfd.ShowDialog() == true) { sheet.SaveAs(sfd.FileName); } } finally { if (book != null) { book.Close(); } if (app != null) { app.Quit(); } this.ReleaseObject(sheet); this.ReleaseObject(book); this.ReleaseObject(app); } } 

我目前遇到的唯一问题是当我在工作表上调用.Save()时,它将原始工作簿中的所有工作表保存到新的工作簿中。 任何想法如何纠正?

提前致谢,
桑尼

您也可以使用Sheet.Copy()方法。

基本上,Sheet.copy复制工作表,并将自动同时创build一个新的工作簿。

在调用Worksheets.get_Item之后,尝试将以下代码行添加到代码中:

 //Copies sheet and puts the copy into a new workbook sheet.Copy(Type.Missing, Type.Missing); //sets the sheet variable to the copied sheet in the new workbook sheet = app.Workbooks[2].Sheets[1]; 

以下是Copy()函数的参考: MSDN链接

我意识到这是一个比较迟的回复,但是我在这方面挣扎了很多,所以我想我会发布我的解决scheme,以便可以帮助其他人解决这个问题。

有一个模板表,你想多次填充:

  public void test() { Excel.Application excelApp; string fileTarget = "C:\target.xlsx"; string fileTemplate = "C:\template.xlsx"; excelApp = new Excel.Application(); Excel.Workbook wbTemp, wbTarget; Excel.Worksheet sh; //Create target workbook wbTarget = excelApp.Workbooks.Open(fileTemplate); //Fill target workbook //Open the template sheet sh = wbTarget.Worksheets["TEMPLATE"]; //Fill in some data sh.Cells[1, 1] = "HELLO WORLD!"; //Rename sheet sh.Name = "1. SHEET"; //Save file wbTarget.SaveAs(fileTarget); //Iterate through the rest of the files for (int i = 1; i < 3; i++) { //Open template file in temporary workbook wbTemp = excelApp.Workbooks.Open(fileTemplate); //Fill temporary workbook //Open the template sheet sh = wbTemp.Worksheets["TEMPLATE"]; //Fill in some data sh.Cells[1, 1] = "HELLO WORLD! FOR THE " + i + ".TH TIME"; //Rename sheet sh.Name = i + ". SHEET"; //Copy sheet to target workbook sh.Copy(wbTarget.Worksheets[1]); //Close temporary workbook without saving wbTemp.Close(false); } //Close and save target workbook wbTarget.Close(true); //Kill excelapp excelApp.Quit(); } 

我想就这个问题给出答案,即使这个问题已经过了一年多了。 我自己也遇到了同样的问题,我正在开发一个项目,花了一段时间才find答案。 我将使用VB.NET代码,而不是C#,因为我不熟悉最后一个。

这里是交易,为了在Excel工作簿之间复制工作表,绝对有必要只使用一个Excel应用程序对象,然后用这个单一的应用程序打开两个工作簿,然后我们可以使用已知的Worksheet.Copy方法,并简单地指定工作表在其他工作簿中的表单之后或之前复制。

 Private Sub ThisWorkbook_Startup() Handles Me.Startup Me.Application.Workbooks.Open(filePath) Me.Application.Workbooks(2).Worksheets("Reporte"). _ Copy(After:=Me.Application.Workbooks(1).Worksheets("Hoja1")) Me.Application.Workbooks(2).Close() Me.Application.DisplayAlerts = False Globals.Hoja1.Delete() Me.Application.DisplayAlerts = True End Sub 

在这种情况下,我正在使用的Excel应用程序是运行我的Excel工作簿项目,但这也可以工作:

 Dim xlApp As New Excel.Application Dim book1 As Excel.Workbook Dim book2 As Excel.Workbook book1 = xlApp.Workbooks.Open(filePath1) book2 = xlApp.Workbooks.Open(filePath2) book1.Worksheets("Sheet to be copied").Copy(After:=book2.Worksheets(1)) 

当然,Excel应用程序将显示两个工作簿,所以在完成复制之后,如果您的意图不是要显示它(或者至less不足以让用户执行任何操作),则应closures源工作簿。

 xlApp.Workbooks(1).Close() 

这是我可以做到这一点的方式,用户会看到一个闪烁的新的工作簿popup,然后closures,这是不是很整洁,但到目前为止,我不知道该怎么做(或做这个复制过程中不 – 可见的方式)

我希望这仍然有一定的价值。 最好的祝福。