比如,我有100个excel文件,格式完全一样,由子公司递交上来,现在需要把所有数据合并到一个excel里面,单个excel的格式并不复杂,总得来讲可以分为表头就数据两在部分,那么多个合并的时候,表头就只要一个,下面是所有数据的合集
excel的格式不固定,但是可以分为表头和数据是一定的,且全起来数据不用考虑操作65535行允许一定的人工操作,比如选定表头等,前提是要能够在winform里面实现,当然全自动分析就更好了我现在感觉要得到表头和数据比较麻烦大家有什么好的意见呢?或者参考代码,谢谢了

解决方案 »

  1.   

    以前做过一个工程数据项目,里面全部是Excel报表数据,里面有各种类型表格,不过每种表格的表头固定,我就是剔除表头再分析处理的。
      

  2.   

    谢谢楼上两位
    样本地址
    http://www.fs2you.com/files/1a4ec58a-63cd-11dd-9615-0014221b798a/ 
    用迅雷可能下载不下来,直接点击,然后保存里面有合并后的样例
      

  3.   

    把每个excel的从第三行开始的rang拷贝放到第一个excel中相应位置
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    using Excel = Microsoft.Office.Interop.Excel;
    namespace ConsoleApplication20
    {
        //添加引用-COM-MicroSoft Excel 11.0 Object Libery
        class Program
        {
            static void Main(string[] args)
            {
                //M为表格宽度标志(Excel中的第M列为最后一列),3为表头高度
                MergeExcel.DoMerge(new string[] 
                {
                    @"E:\excel\类型A\公司A.xls", 
                    @"E:\excel\类型A\公司B.xls" 
                },
                    @"E:\excel\类型A\合并测试.xls", "M", 3);
                MergeExcel.DoMerge(new string[] 
                {
                    @"E:\excel\类型B\统计表A.xls", 
                    @"E:\excel\类型B\统计表B.xls" 
                },
                    @"E:\excel\类型B\合并测试.xls", "I", 4);
            }        
        }
        public class MergeExcel
        {
            
            Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();
            //保存目标的对象
            Excel.Workbook bookDest = null;
            Excel.Worksheet sheetDest = null;
            //读取数据的对象 
            Excel.Workbook bookSource = null;
            Excel.Worksheet sheetSource = null;
            string[] _sourceFiles = null;
            string _destFile = string.Empty;
            string _columnEnd = string.Empty;
            int _headerRowCount = 1;
            int _currentRowCount = 0;        public MergeExcel(string[] sourceFiles,string destFile,string columnEnd,int headerRowCount)
            {
                
                bookDest = (Excel.WorkbookClass)app.Workbooks.Add(Missing.Value);
                sheetDest = bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.Worksheet;
                sheetDest.Name = "Data";            _sourceFiles = sourceFiles;
                _destFile = destFile;
                _columnEnd = columnEnd;
                _headerRowCount = headerRowCount;        }
            /// <summary>
            /// 打开工作表
            /// </summary>
            /// <param name="fileName"></param>
            void OpenBook(string fileName)
            {
                bookSource = app.Workbooks._Open(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value
                    , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                    , Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                sheetSource = bookSource.Worksheets[1] as Excel.Worksheet;
            }
            /// <summary>
            /// 关闭工作表
            /// </summary>
            void CloseBook()
            {
                bookSource.Close(false, Missing.Value, Missing.Value);
            }
            /// <summary>
            /// 复制表头
            /// </summary>
            void CopyHeader()
            {
                Excel.Range range = sheetSource.get_Range("A1", _columnEnd + _headerRowCount.ToString());
                range.Copy(sheetDest.get_Range("A1",Missing.Value));
                _currentRowCount += _headerRowCount;
            }
            /// <summary>
            /// 复制数据
            /// </summary>
            void CopyData()
            {
                int sheetRowCount = sheetSource.UsedRange.Rows.Count;
                Excel.Range range = sheetSource.get_Range(string.Format("A{0}", _headerRowCount + 1), _columnEnd + sheetRowCount.ToString());
                range.Copy(sheetDest.get_Range(string.Format("A{0}", _currentRowCount + 1), Missing.Value));
                _currentRowCount += range.Rows.Count;
            }
            /// <summary>
            /// 保存结果
            /// </summary>
            void Save()
            {
                bookDest.Saved = true;
                bookDest.SaveCopyAs(_destFile);
            }
            /// <summary>
            /// 退出进程
            /// </summary>
            void Quit()
            {
                app.Quit();
            }
            /// <summary>
            /// 合并
            /// </summary>
            void DoMerge()
            {
                bool b = false;
                foreach (string strFile in _sourceFiles)
                {
                    OpenBook(strFile);
                    if (b == false)
                    {
                        CopyHeader();
                        b = true;
                    }
                    CopyData();
                    CloseBook();
                }
                Save();
                Quit();
            }
            /// <summary>
            /// 合并表格
            /// </summary>
            /// <param name="sourceFiles">源文件</param>
            /// <param name="destFile">目标文件</param>
            /// <param name="columnEnd">最后一列标志</param>
            /// <param name="headerRowCount">表头行数</param>
            public static void DoMerge(string[] sourceFiles, string destFile, string columnEnd, int headerRowCount)
            {
                new MergeExcel(sourceFiles, destFile, columnEnd, headerRowCount).DoMerge();
            }
        }}
      

  5.   

    谢谢“jinjazz ”,现在没办法看,待会回家看加上100分,感谢各位的热心帮助
      

  6.   

    个人赞同:把每个excel的从第三行开始的rang拷贝放到第一个excel中相应位置,这样可以避免一些复制的算法。
      

  7.   

    学习学习。。EXECL。DLL一直让我很反感。。