如何在C#中将两个Excel工作簿合并到一个工作簿中?

让我们考虑一下,我在本地有两个Excel文件(工作簿)。 每个Excel工作簿都有3个工作表。

让我们说WorkBook1有Sheet1,Sheet2,Sheet3

Workbook2有Sheet1,Sheet2,Sheet3。

所以在这里我需要将这两个excel工作簿合并为一个新的excel工作簿,让我们说Workbook3将有6个工作表(workbook1和workbook2的组合)。

我需要在不使用任何第三方工具的情况下在c#中执行此操作的代码。 如果第三方工具是免费版本,那么它的罚款。

这是一个将两本书合并成一本新书的工作样本,希望它会给你一个想法:

using System; using Excel = Microsoft.Office.Interop.Excel; using System.Reflection; namespace MergeWorkBooks { class Program { static void Main(string[] args) { Excel.Application app = new Excel.Application(); app.Visible = true; app.Workbooks.Add(""); app.Workbooks.Add(@"c:\MyWork\WorkBook1.xls"); app.Workbooks.Add(@"c:\MyWork\WorkBook2.xls"); for (int i = 2; i <= app.Workbooks.Count; i++) { int count = app.Workbooks[i].Worksheets.Count; app.Workbooks[i].Activate(); for (int j=1; j <= count; j++) { Excel._Worksheet ws = (Excel._Worksheet)app.Workbooks[i].Worksheets[j]; ws.Select(Type.Missing); ws.Cells.Select(); Excel.Range sel = (Excel.Range)app.Selection; sel.Copy(Type.Missing); Excel._Worksheet sheet = (Excel._Worksheet)app.Workbooks[1].Worksheets.Add( Type.Missing, Type.Missing, Type.Missing, Type.Missing ); sheet.Paste(Type.Missing, Type.Missing); } } } } } 

更简单的解决方案是复制工作表本身 ,而不是他们的单元格。

此方法采用任意数量的Excel文件路径并将其复制到新文件中:

 private static void MergeWorkbooks(string destinationFilePath, params string[] sourceFilePaths) { var app = new Application(); app.DisplayAlerts = false; // No prompt when overriding // Create a new workbook (index=1) and open source workbooks (index=2,3,...) Workbook destinationWb = app.Workbooks.Add(); foreach (var sourceFilePath in sourceFilePaths) { app.Workbooks.Add(sourceFilePath); } // Copy all worksheets Worksheet after = destinationWb.Worksheets[1]; for (int wbIndex = app.Workbooks.Count; wbIndex >= 2; wbIndex--) { Workbook wb = app.Workbooks[wbIndex]; for (int wsIndex = wb.Worksheets.Count; wsIndex >= 1; wsIndex--) { Worksheet ws = wb.Worksheets[wsIndex]; ws.Copy(After: after); } } // Close source documents before saving destination. Otherwise, save will fail for (int wbIndex = 2; wbIndex <= app.Workbooks.Count; wbIndex++) { Workbook wb = app.Workbooks[wbIndex]; wb.Close(); } // Delete default worksheet after.Delete(); // Save new workbook destinationWb.SaveAs(destinationFilePath); destinationWb.Close(); app.Quit(); } 

编辑:请注意,如果工作表之间存在依赖关系,例如数据透视表,图表,公式等,您可能需要Move方法而不是Copy 。否则,数据源将断开连接,并且一个工作表中的任何更改都不会影响另一个工作表。

您正在寻找C#中的Office Autmation库。
以下是帮助您入门的示例代码。

  System.Data.Odbc.OdbcDataAdapter Odbcda; //CSV File strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + SourceLocation + ";Extensions=asc,csv,tab,txt;Persist Security Info=False"; sqlSelect = "select * from [" + filename + "]"; System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection(strConnString.Trim()); conn.Open(); Odbcda = new System.Data.Odbc.OdbcDataAdapter(sqlSelect, conn); Odbcda.Fill(ds, DataTable); conn.Close(); 
  • 这会将excel文件的内容读入数据集。
  • 像这样创建多个数据集,然后进行合并。

代码直接来自这里 。