繁体   English   中英

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

[英]How to merge two Excel workbook into one workbook in C#?

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

假设 WorkBook1 有 Sheet1、Sheet2、Sheet3

Workbook2 有 Sheet1、Sheet2、Sheet3。

所以在这里我需要将这两个 excel 工作簿合并成一个新的 excel 工作簿,比如说 Workbook3,它将有总共 6 个工作表(workbook1 和 workbook2 的组合)。

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

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

此方法采用任意数量的 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#自动执行Excel任务。

  1. 使用Microsoft.Office.Interops库
  2. 使用第三方库

当Microsoft提供自己的库时,为什么还要去第三方库? 我很高兴你问。

  • 首先,Microsoft.Office.Interop库作为开发人员很糟糕。 文档很烂,对象模型很复杂。 看这个例子
  • 其次,该库直接与Excel交互。 即,它打开一个Excel实例,然后完成工作。 这意味着,您将需要在相关计算机上安装Excel(并非总是有问题)。 此外,这还会导致一些严重的性能问题,尤其是在使用大型数据集或多个文件的情况下。

这就是为什么有大量第三方库可用的原因。 付费和开源。 我通常不喜欢花钱买东西,并且发现开源,免费的ExcelMapper (对于非常简单的场景)和EPPlus库非常有用。

如何使用EPPlus合并两个Excel工作簿这里是代码:

 var file1 = new FileInfo(@"C:\Temp\Sample\Book 1.xlsx");
 var file2 = new FileInfo(@"C:\Temp\Sample\Book 2.xlsx");
 var mergedFileName = new FileInfo(@"C:\Temp\Sample\Merged.xlsx");

 //lets open the file
 using (var firstFile = new ExcelPackage(file1))
 {
      using (var secondFile = new ExcelPackage(file2))
      {
           foreach (var ws in secondFile.Workbook.Worksheets)
           {
               string worksheetName = ws.Name;
               // if worksheet name already exists - change name
               if (firstFile.Workbook.Worksheets.Any(ar => ar.Name == ws.Name))
                   worksheetName = string.Format("{0} - {1}", worksheetName, "Copy");

                firstFile.Workbook.Worksheets.Add(worksheetName, ws);
            }
       }

       firstFile.SaveAs(mergedFileName);
 }

这是运行代码时的样子: 在此处输入图片说明 (来源: excel-automation-guide.com

您正在寻找 C# 中的 Office 自动化库。
是帮助您入门的示例代码。

 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 文件的内容读入数据集。
  • 像这样创建多个数据集,然后进行合并。

代码直接取自这里

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

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);

                }


            }

        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM