4

For merging of two excel sheet, I am using below code.

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

                }
            }
        }
    }
}

This code is working good for me for merging excel workbook. But at the time of merging I am not getting the excel sheet names. Here I need that when the excel is merging at the same time the sheet names should also go to the merged excel sheet.

bytecode77
  • 14,163
  • 30
  • 110
  • 141
Tripati Subudhi
  • 1,651
  • 10
  • 22
  • 26

2 Answers2

8

The following worked fine for me, including copying the name and where the name clashed it kindly even handled the Sheet1(2) etc.

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++)
{
    for (int j = 1; j <= app.Workbooks[i].Worksheets.Count;j++ )
    {
        Excel.Worksheet ws = app.Workbooks[i].Worksheets[j];
        ws.Copy(app.Workbooks[1].Worksheets[1]);
    }
}
BugFinder
  • 17,474
  • 4
  • 36
  • 51
  • 1
    When I am going to run this then I am getting below error. Compiler Error Message: CS0266: Cannot implicitly convert type 'object' to 'Microsoft.Office.Interop.Excel.Worksheet'. An explicit conversion exists (are you missing a cast?) And also it is saying "No overload for method 'Copy' takes '1' arguments" – Tripati Subudhi Sep 27 '11 at 13:24
  • Well, other than the name of the 2 workbooks to merge, that was my entire app. Im guessing they changed it in Office2010 then. – BugFinder Sep 27 '11 at 14:37
  • @TripatiSubudhi Did you end up finding a solution for this? Just using Excel.Worksheet ws = (Excel.Worksheet) app.Workbooks[i].Worksheets[j]; ? – William Humphries Jul 13 '20 at 18:27
0

Error Free and Improve Answer

create result2.xlsx file as same location and you find final excel sheet as you want

 class Program
     {        
      static void Main(string[] args)
        {
        Application app = new Application();
        app.Visible = true;
        Workbook w1 = app.Workbooks.Add(@"D:\MyDownload\result2.xlsx");
        Workbook w2 = app.Workbooks.Add(@"D:\MyDownload\merge1.xlsx");
        Workbook w3 = app.Workbooks.Add(@"D:\MyDownload\merge2.xlsx");
        for (int i = 2; i <= app.Workbooks.Count; i++)
        {
            for (int j = 1; j <= app.Workbooks[i].Worksheets.Count; j++)
            {
                Worksheet ws = (Worksheet)app.Workbooks[i].Worksheets[j];
                ws.Copy(app.Workbooks[1].Worksheets[1]);
            }
        }
        app.Workbooks[1].SaveCopyAs(@"D:\MyDownload\result2.xlsx");
        w1.Close(0);
        w2.Close(0);
        w3.Close(0);
        app.Quit();
    }
}
Ashu
  • 19
  • 6