Excel 简单的合并

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Reflection;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Excel 合并
            string connString1 = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=test1.xls;Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
            string connString2 = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=test2.xls;Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
            DataTable dt1 = GetDataTable(connString1);
            DataTable dt2 = GetDataTable(connString2);
            var l1 = DataTable2List<QQ>(dt1);
            var l2 = DataTable2List<QQ>(dt2);
            var l = l1.Concat(l2).Distinct(new QQEqualityComparer());
            foreach (var item in l)
            {
                Console.WriteLine(item.Number + "," + item.Name);
            }
                            
            #endregion
            Console.ReadKey(true);
        }
        static DataTable GetDataTable(string connString)
        {
            DataTable table = null;
            using (OleDbConnection conn = new OleDbConnection(connString))
            {
                OleDbDataAdapter adapter = null;
                DataSet ds = new DataSet();
                adapter = new OleDbDataAdapter("select * from [Sheet1$]", conn);
                adapter.Fill(ds, "table1");
                table = ds.Tables[0];
            }
            return table;
        }
        static List<T> DataTable2List<T>(DataTable table) where T : class,new()
        {
            //创建一个属性的列表
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            //获取TResult的类型实例  反射的入口
            Type t = typeof(T);
            //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
            Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (table.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
            //创建返回的集合
            List<T> oblist = new List<T>();
            foreach (DataRow row in table.Rows)
            {
                //创建TResult的实例
                T ob = new T();
                //找到对应的数据  并赋值
                prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                //放入到返回的集合中.
                oblist.Add(ob);
            }
            return oblist;
        }
    }
    //class QQ:IEqualityComparer<QQ>
    //{
    //    public string Number { get; set; }
    //    public string Name { get; set; }
    //    public bool Equals(QQ x, QQ y)    //比较x和y对象是否相同,按照地址比较
    //    {
    //        return x.Number == y.Number;
    //    }
    //    public int GetHashCode(QQ obj)
    //    {
    //        return obj.ToString().GetHashCode();
    //    }
    //}
    class QQ
    {
        public string Number { get; set; }
        public string Name { get; set; }
    }
    class QQEqualityComparer : IEqualityComparer<QQ>
    {
        public bool Equals(QQ x, QQ y)
        {
            return x.Number == y.Number;
        }
        public int GetHashCode(QQ obj)
        {
            return obj.ToString().GetHashCode();
        }
    }
}


点击查看原图

知识共享许可协议
《Excel 简单的合并》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     199.74ms