C#合并多个结构一样的Excel2011-04-17有多个结构一样的Excel,带复杂表头需要合并为一个,且去掉多余的表头数据,可以用COM组件来读取每个Excel表格的Range来合并到一个新的表格中。样例如图

有很多相同格式的表格,合并代码如下:
1.usingSystem;2.usingSystem.Collections.Generic;3.usingSystem.Text;4.usingSystem.Reflection;5.usingExcel = Microsoft.Office.Interop.Excel;6.namespaceConsoleApplication207.{8. //添加引用-COM-MicroSoft Excel 11.0 Object Libery9. classProgram10.{11. static voidMain( string [] args)12.{13. //M为表格宽度标志(Excel中的第M列为最后一列),3为表头高度14.MergeExcel.DoMerge( new string []15.{16.@ "E:excel类型A公司A.xls" ,17.@ "E:excel类型A公司B.xls"18.},19.@ "E:excel类型A合并测试.xls" ,"M" , 3);20.MergeExcel.DoMerge( new string []21.{22.@ "E:excel类型B统计表A.xls" ,23.@ "E:excel类型B统计表B.xls"24.},25.@ "E:excel类型B合并测试.xls" ,"I" , 4);26.}27.28.29.30.31.}32. public classMergeExcel33.{34.35.Excel.Application app =newMicrosoft.Office.Interop.Excel.ApplicationClass();36. //保存目标的对象37.Excel.Workbook bookDest =null ;38.Excel.Worksheet sheetDest =null ;39. //读取数据的对象40.Excel.Workbook bookSource =null ;41.Excel.Worksheet sheetSource =null ;42.43.44. string [] _sourceFiles =null ;45. string_destFile =string .Empty;46. string_columnEnd =string .Empty;47. int_headerRowCount = 1;48. int_currentRowCount = 0;49.50. publicMergeExcel( string [] sourceFiles, stringdestFile, stringcolumnEnd, intheaderRowCount)51.{52.53.bookDest = (Excel.WorkbookClass)app.Workbooks.Add(Missing.Value);54.sheetDest = bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value)asExcel.Worksheet;55.sheetDest.Name ="Data" ;56.57._sourceFiles = sourceFiles;58._destFile = destFile;59._columnEnd = columnEnd;60._headerRowCount = headerRowCount;61.62.}63. /// <summary>64. /// 打开工作表65. /// </summary>66. /// <param name="fileName"></param>67. voidOpenBook( stringfileName)68.{69.bookSource = app.Workbooks._Open(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value70., Missing.Value, Missing.Value, Missing.Value, Missing.Value71., Missing.Value, Missing.Value, Missing.Value, Missing.Value);72.sheetSource = bookSource.Worksheets[1]asExcel.Worksheet;73.}74. /// <summary>75. /// 关闭工作表76. /// </summary>77. voidCloseBook()78.{79.bookSource.Close( false , Missing.Value, Missing.Value);80.}81. /// <summary>82. /// 复制表头83. /// </summary>84. voidCopyHeader()85.{86.Excel.Range range = sheetSource.get_Range( "A1" , _columnEnd + _headerRowCount.ToString());87.range.Copy(sheetDest.get_Range( "A1" ,Missing.Value));88._currentRowCount += _headerRowCount;89.}90. /// <summary>91. /// 复制数据92. /// </summary>93. voidCopyData()94.{95. intsheetRowCount = sheetSource.UsedRange.Rows.Count;96.Excel.Range range = sheetSource.get_Range( string .Format( "A{0}" , _headerRowCount + 1), _columnEnd + sheetRowCount.ToString());97.range.Copy(sheetDest.get_Range( string .Format( "A{0}" , _currentRowCount + 1), Missing.Value));98._currentRowCount += range.Rows.Count;99.}100. /// <summary>101. /// 保存结果102. /// </summary>103. voidSave()104.{105.bookDest.Saved =true ;106.bookDest.SaveCopyAs(_destFile);107.}108. /// <summary>109. /// 退出进程110. /// </summary>111. voidQuit()112.{113.app.Quit();114.}115. /// <summary>116. /// 合并117. /// </summary>118. voidDoMerge()119.{120. boolb =false ;121. foreach( stringstrFilein_sourceFiles)122.{123.OpenBook(strFile);124. if(b ==false )125.{126.CopyHeader();127.b =true ;128.}129.CopyData();130.CloseBook();131.}132.Save();133.Quit();134.}135. /// <summary>136. /// 合并表格137. /// </summary>138. /// <param name="sourceFiles">源文件</param>139. /// <param name="destFile">目标文件</param>140. /// <param name="columnEnd">最后一列标志</param>141. /// <param name="headerRowCount">表头行数</param>142. public static voidDoMerge( string [] sourceFiles,stringdestFile,stringcolumnEnd,intheaderRowCount)143.{144. newMergeExcel(sourceFiles, destFile, columnEnd, headerRowCount).DoMerge();145.}146.}147.148.}149.