2014-12-04 121 views
0

所以我试图做一个Excel工作表聚合器。在我的工作中,我们得到了一些向我们发送了一堆单独的excel文件的人,这些文件全部仅与1张相关。如何合并多个Excel文件到一个Excel文件

我在某种程度上跟随this previous post's ideas。但是在这样做的时候,我复制的一些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); 
+0

实际上你想要做什么?你想复制非空白的Excel文件,或复制时获得的Excel文件? @Alexander Ryan Baggett – 2014-12-04 04:33:50

+0

正如我在说明中试图解释的那样。我想打开多个Excel文件。将这些文件中的每张纸复制到一个新的excel文件中。 – 2014-12-04 05:50:07

+0

我打开的文件上的Excel表格不是空白的。 – 2014-12-04 05:50:25

回答

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 2017-01-18 12:08:13

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"); 
    } 
    } 
} 
相关问题