有多個結構一樣的Excel,帶復雜表頭需要合並為一個,且去掉多余的表頭數據,可以用COM組件來讀取每個Excel表格的Range來合並到一個新的表格中。樣例如圖
有很多相同格式的表格,合並代碼如下:
1.using System; 2.using System.Collections.Generic; 3.using System.Text; 4.using System.Reflection; 5.using Excel = Microsoft.Office.Interop.Excel; 6.namespace ConsoleApplication20 7.{ 8. //添加引用-COM-MicroSoft Excel 11.0 Object Libery 9. class Program 10. { 11. static void Main( 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 class MergeExcel 33. { 34. 35. Excel.Application app = new Microsoft.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. public MergeExcel( string [] sourceFiles, string destFile, string columnEnd, int headerRowCount) 51. { 52. 53. bookDest = (Excel.WorkbookClass)app.Workbooks.Add(Missing.Value); 54. sheetDest = bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.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. void OpenBook( string fileName) 68. { 69. bookSource = app.Workbooks._Open(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value 70. , Missing.Value, Missing.Value, Missing.Value, Missing.Value 71. , Missing.Value, Missing.Value, Missing.Value, Missing.Value); 72. sheetSource = bookSource.Worksheets[1] as Excel.Worksheet; 73. } 74. /// <summary> 75. /// 關閉工作表 76. /// </summary> 77. void CloseBook() 78. { 79. bookSource.Close( false , Missing.Value, Missing.Value); 80. } 81. /// <summary> 82. /// 復制表頭 83. /// </summary> 84. void CopyHeader() 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. void CopyData() 94. { 95. int sheetRowCount = 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. void Save() 104. { 105. bookDest.Saved = true ; 106. bookDest.SaveCopyAs(_destFile); 107. } 108. /// <summary> 109. /// 退出進程 110. /// </summary> 111. void Quit() 112. { 113. app.Quit(); 114. } 115. /// <summary> 116. /// 合並 117. /// </summary> 118. void DoMerge() 119. { 120. bool b = false ; 121. foreach ( string strFile in _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 void DoMerge( string [] sourceFiles, string destFile, string columnEnd, int headerRowCount) 143. { 144. new MergeExcel(sourceFiles, destFile, columnEnd, headerRowCount).DoMerge(); 145. } 146. } 147. 148.} 149.