2014-12-04 3 views
0

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

Я следовал за некоторой степенью this previous post's ideas. Но после этого некоторые из листов 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 

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

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

Что вы хотите сделать на самом деле? Вы хотите скопировать файлы excel, которые не являются пустыми или являются файлами Excel при копировании? @Alexander Ryan Baggett –

+0

Как я и пытался объяснить в описании. Я хочу открыть несколько файлов excel. Скопируйте каждый лист из этих файлов в один новый файл excel. –

+0

Листы Excel в файлах, которые я открываю, не пустые. –

ответ

1

В своем внутреннем цикле вы добавляете новый рабочий лист в свою «финализированную» книгу («лист») И скопируйте лист перед ним для каждого исходного листа. Таким образом, каждый «лист», созданный вашей командой 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(); 
+0

Я пробовал и, кажется, копирует только текст - без каких-либо стилей/шрифтов/цвета и т. д. могут быть проблемы с версией Excel.Interop, я не уверен. – itsho

1

Самый простой способ объединить рабочие листы в один через компонент третьей части под названием 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"); 
    } 
    } 
} 
Смежные вопросы