C#合并多个结构一样的Excel

有多个结构一样的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-MicroSoftExcel11.0ObjectLibery
  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. public class MergeExcel
  29. {
  30. Excel.Applicationapp= new Microsoft.Office.Interop.Excel.ApplicationClass();
  31. //保存目标的对象
  32. Excel.WorkbookbookDest= null ;
  33. Excel.WorksheetsheetDest= null ;
  34. //读取数据的对象
  35. Excel.WorkbookbookSource= null ;
  36. Excel.WorksheetsheetSource= null ;
  37. string []_sourceFiles= null ;
  38. string _destFile= string .Empty;
  39. string _columnEnd= string .Empty;
  40. int _headerRowCount=1;
  41. int _currentRowCount=0;
  42. public MergeExcel( string []sourceFiles, string destFile, string columnEnd, int headerRowCount)
  43. {
  44. bookDest=(Excel.WorkbookClass)app.Workbooks.Add(Missing.Value);
  45. sheetDest=bookDest.Worksheets.Add(Missing.Value,Missing.Value,Missing.Value,Missing.Value) as Excel.Worksheet;
  46. sheetDest.Name= "Data" ;
  47. _sourceFiles=sourceFiles;
  48. _destFile=destFile;
  49. _columnEnd=columnEnd;
  50. _headerRowCount=headerRowCount;
  51. }
  52. ///<summary>
  53. ///打开工作表
  54. ///</summary>
  55. ///<paramname="fileName"></param>
  56. void OpenBook( string fileName)
  57. {
  58. bookSource=app.Workbooks._Open(fileName,Missing.Value,Missing.Value,Missing.Value,Missing.Value
  59. ,Missing.Value,Missing.Value,Missing.Value,Missing.Value
  60. ,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
  61. sheetSource=bookSource.Worksheets[1] as Excel.Worksheet;
  62. }
  63. ///<summary>
  64. ///关闭工作表
  65. ///</summary>
  66. void CloseBook()
  67. {
  68. bookSource.Close( false ,Missing.Value,Missing.Value);
  69. }
  70. ///<summary>
  71. ///复制表头
  72. ///</summary>
  73. void CopyHeader()
  74. {
  75. Excel.Rangerange=sheetSource.get_Range( "A1" ,_columnEnd+_headerRowCount.ToString());
  76. range.Copy(sheetDest.get_Range( "A1" ,Missing.Value));
  77. _currentRowCount+=_headerRowCount;
  78. }
  79. ///<summary>
  80. ///复制数据
  81. ///</summary>
  82. void CopyData()
  83. {
  84. int sheetRowCount=sheetSource.UsedRange.Rows.Count;
  85. Excel.Rangerange=sheetSource.get_Range( string .Format( "A{0}" ,_headerRowCount+1),_columnEnd+sheetRowCount.ToString());
  86. range.Copy(sheetDest.get_Range( string .Format( "A{0}" ,_currentRowCount+1),Missing.Value));
  87. _currentRowCount+=range.Rows.Count;
  88. }
  89. ///<summary>
  90. ///保存结果
  91. ///</summary>
  92. void Save()
  93. {
  94. bookDest.Saved= true ;
  95. bookDest.SaveCopyAs(_destFile);
  96. }
  97. ///<summary>
  98. ///退出进程
  99. ///</summary>
  100. void Quit()
  101. {
  102. app.Quit();
  103. }
  104. ///<summary>
  105. ///合并
  106. ///</summary>
  107. void DoMerge()
  108. {
  109. bool b= false ;
  110. foreach ( string strFile in _sourceFiles)
  111. {
  112. OpenBook(strFile);
  113. if (b== false )
  114. {
  115. CopyHeader();
  116. b= true ;
  117. }
  118. CopyData();
  119. CloseBook();
  120. }
  121. Save();
  122. Quit();
  123. }
  124. ///<summary>
  125. ///合并表格
  126. ///</summary>
  127. ///<paramname="sourceFiles">源文件</param>
  128. ///<paramname="destFile">目标文件</param>
  129. ///<paramname="columnEnd">最后一列标志</param>
  130. ///<paramname="headerRowCount">表头行数</param>
  131. public static void DoMerge( string []sourceFiles, string destFile, string columnEnd, int headerRowCount)
  132. {
  133. new MergeExcel(sourceFiles,destFile,columnEnd,headerRowCount).DoMerge();
  134. }
  135. }
  136. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值