Как объединить несколько файлов Excel в один файл Excel

Итак, я пытался создать агрегатор листов в формате Excel. В моей работе есть люди, которые присылают нам кучу отдельных файлов Excel, каждый из которых связан с использованием только одного листа.

В какой-то степени я следил за идеи из предыдущего поста. Но после этого некоторые из листов Excel, которые я скопировал, оказались пустыми. Только определенные. Понятия не имею, почему одни пустые, а другие нормальные.

Вот код, который я использую для открытия и копирования файлов Excel

         OpenFileDialog browse = new OpenFileDialog();
            browse.Multiselect = true;
            DialogResult result = browse.ShowDialog();

            if (result == DialogResult.OK)

                try //try to open it. If its a proper excel file
                {   
                    excel = new Excel.Application();
                    excel.Workbooks.Add("");
                    finalized = excel.Workbooks[1];
                    excel.SheetsInNewWorkbook = 1;
                    for(int i=0; i< browse.FileNames.Length; i++)
                    {
                        excel.Workbooks.Add(browse.FileNames[i]);
                    }
                    //skip the first workbook as it is the finalized one
                    //also note everything in excel starts at 1 and not 0
                    for(int i=2; i<excel.Workbooks.Count; i++)
                    {
                        int count = excel.Workbooks[i].Worksheets.Count;
                        excel.Workbooks[i].Activate();
                        for (int j = 1; j < count; j++)
                        {

                            Excel._Worksheet pastee = (Excel._Worksheet)excel.Workbooks[i].Worksheets[j];
                            Excel._Worksheet sheet = (Excel._Worksheet)finalized.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                            //Excel._Worksheet sheet = finalized.Sheets[1];
                            pastee.Copy(Before: sheet);


                        }//end of for j
                    }//end of for i
                }//end of try

Вот код, который я использую для сохранения файла Excel

            SaveFileDialog browse = new SaveFileDialog();
            browse.Title = "Save as Excel";
            browse.Filter = "Excel workbook | *.xlsx";
            DialogResult result = browse.ShowDialog();

            finalized.SaveAs(browse.FileName, Excel.XlFileFormat.xlWorkbookDefault);

            MessageBox.Show("Success", "Message");
            //unlock the file
            Global.releaseComObjects(finalized, excel);

person Alexander Ryan Baggett    schedule 04.12.2014    source источник
comment
Что ты хочешь делать на самом деле? Вы хотите скопировать непустые файлы Excel или файлы Excel, получаемые при копировании? @ Александр Райан Баггетт   -  person Sarath KS    schedule 04.12.2014
comment
Как я пытался объяснить в описании. Я хочу открыть несколько файлов Excel. Скопируйте каждый лист из этих файлов в один новый файл Excel.   -  person Alexander Ryan Baggett    schedule 04.12.2014
comment
Листы Excel в файлах, которые я открываю, не пустые.   -  person Alexander Ryan Baggett    schedule 04.12.2014
comment
На самом деле нашел свободно доступную надстройку для того, что отлично работает: rondebruin.nl/win/ addins / rdbmerge.htm   -  person Robbert Koppenol    schedule 04.12.2014


Ответы (3)


Во внутреннем цикле вы добавляете новый лист в свою «завершенную» книгу («лист») И копируете лист перед ним для каждого исходного листа. Таким образом, каждый «лист», созданный вашей командой Add, будет пустым, поскольку фактически вы создаете два листа для каждого исходного листа. Другая проблема заключается в том, что, как вы упомянули, массивы в Excel основаны на 1; поэтому вам нужно зацикливаться, пока j <= count не j < count.

Поэтому я думаю, что этот код будет работать лучше:

Excel.Worksheet dummy = finalized.Worksheets[1];

for (int i = 2; i <= excel.Workbooks.Count; i++)
{
    int count = excel.Workbooks[i].Worksheets.Count;

    for (int j = 1; j <= count; j++)
    {
        Excel._Worksheet pastee = (Excel._Worksheet)excel.Workbooks[i].Worksheets[j];
        pastee.Copy(dummy);
    }
}

dummy.Delete();
person Fratyx    schedule 04.12.2014
comment
Я попробовал и, похоже, копирует только текст - без стиля / шрифтов / цветов и т. Д. Может быть проблема с версией Excel.Interop, я не уверен. - person itsho; 18.01.2017


Самый простой способ объединить рабочие листы в один - использовать компонент третьей части под названием Spire.Xls. Это отдельный компонент .NET.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spire.Xls;
using System.Data;


namespace Spire.XLS
{
    class Program
    {
        static void Main(string[] args)
    {

        Workbook workbook = new Workbook();
        //load the first workbook
        workbook.LoadFromFile(@"merge1.xlsx");
        //load the second workbook
        Workbook workbook2 = new Workbook();
        workbook2.LoadFromFile(@"merge2.xlsx");

        //import the second workbook's worksheet into the first workbook using a datatable
        Worksheet sheet2 = workbook2.Worksheets[0];
        DataTable dataTable = sheet2.ExportDataTable();
        Worksheet sheet1 = workbook.Worksheets[0];
        sheet1.InsertDataTable(dataTable, false, sheet1.LastRow + 1, 1);


        //save the workbook
        workbook.SaveToFile("result.xlsx");
    }
    }
}
person monkSinha    schedule 05.07.2017
comment
Без покупки Spire.Xls ограничение составляет 3 страницы. - person William Humphries; 13.07.2020