Asp.net 批量导入Excel用户数据功能加强版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/admans/article/details/82906100

平时我们用Asp.net导入用户,一般是提供一个用户Excel表的模板,实际导入数据时并非有些人愿意按你的模版制表,因此对Asp.net导入功能进行加强,可以导入非模版化的Excel数据,并且支持一次处理多个Sheet表,方便的录入人员。

第一步、上传Excel:

代码略。

第二步、读取Excel数据到DataSet:

具体怎么读取Excel数据,网上到处都有,代码略。

第三步、处理DataSet数据并导入到库

平时这一步,一般都是取默认Excel的第一个sheet,由于采用的模板化,字段名与数据库字段相匹配,直接导入即可。

如今,为了方便处理非模板化的Excel,就要让录入人员可以自行匹配对应的列,加强工作就从这里开始:

先看哈操作界面和Excel表的结构:

↑导入界面

↑原始数据表

↑上传Excel,选择要导入的Sheet表

↑对应选择匹配内容

部分主要代码:

        /// <summary>
        /// 上传Excel 按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnUpload_Click(object sender, EventArgs e)
        {

           //检测是否Excel文件、创建服务器临时目录(如果目录不存在)、上传文件到服务器  代码略
           // ……………………………………

            dsExcel = new DataSet();
            DataSet ds = GetExcelData(uploadFilePath);//将Excel数据全部读入DataSet  GetExcelData 参考网上现有代码即可。

            if(ds==null)return;

            //清除空sheet 只保留有数据的sheet
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                DataTable dt = ds.Tables[i].Copy();//必须复制表才能添加到新的DataSet
                try
                {
                    if (dt.Columns[0].ColumnName == "F1" && dt.Rows[0][0].ToString() == "")
                    {
                        //ds.Tables.Remove(dt);
                    }
                    else
                    {
                        dsExcel.Tables.Add(dt);
                    }
                }
                catch
                {
                    // ignored
                }
            }


            ViewState["dsExcel"] = dsExcel;

            ddlExcelSheets.DataSource = dsExcel.Tables;
            ddlExcelSheets.DataBind();

            dtUsers = dsExcel.Tables[0];
            usersCount.InnerText = dtUsers.Rows.Count + "条记录";
            BindTableColumnName();
            ViewState["dtUsers"] = dtUsers; 
        }
        /// <summary>
        /// 切换Excel sheet数据表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlExcelSheets_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (dsExcel == null && ViewState["dsExcel"] != null)
            {
                dsExcel = (DataSet)ViewState["dsExcel"];
            }

            if (dsExcel != null)
            {
                dtUsers = dsExcel.Tables[ddlExcelSheets.SelectedValue];

                usersCount.InnerText = dtUsers.Rows.Count + "条记录";

                //切换sheet表后,重新绑定各选择项
                BindTableColumnName();

                ViewState["dtUsers"] = dtUsers;
            }
        }
        /// <summary>
        /// 切换Excel sheet表后,重新绑定各选择项 
        /// </summary>
        private void BindTableColumnName()
        {
            ddlUserNameTitle.Items.Clear();
            ddlUserNameTitle.DataSource = dtUsers.Columns;
            ddlUserNameTitle.DataBind();
            ddlUserNameTitle.Items.Insert(0, new ListItem("选择对应列", ""));

            …………………………………………
        }
        /// <summary>
        /// 提交确认按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSub_Click(object sender, EventArgs e)
        {
            if (dtUsers == null && ViewState["dtUsers"] != null)
            {
                dtUsers = (DataTable)ViewState["dtUsers"];
            }

            if (dtUsers == null || dtUsers.Rows.Count < 1)
            {
                MessageBox.Show(this, "无可用数据!");
                return;
            }
            if (string.IsNullOrEmpty(ddlUserNameTitle.SelectedValue))
            {
                MessageBox.Show(this, "请设置用户名!");
                return;
            }

            //其它检测工作 
            //………………………………

            DataTable dtExistUsers = dtUsers.Clone();//添加失败记录,包括已经存在用户
            DataTable dtAddUsers = dtUsers.Clone();//添加成功记录

            var bp = new Bll();
            var mp = new Modle();

            //遍历用户表、处理用户数据
            foreach (DataRow dr in dtUsers.Rows)
            {
                mp.UserID = dr[ddlUserNameTitle.SelectedValue].ToString();

                if (bp.Exist(mp.UserID))
                {
                    //已经存在同名用户
                    dtExistUsers.ImportRow(dr);

                }
                else
                {
                    //关键就在类似 “ddlUserTrueNameTitle.SelectedValue” 进行值的匹配
                    mp.userTrueName = dr[ddlUserTrueNameTitle.SelectedValue].ToString();
                    mp.StudentNumber = dr[ddlUserNumTitle.SelectedValue].ToString();
                    
                    //其它属性参数
                    //……………………

                    if (bp.Add(mp))
                    {
                        dtAddUsers.ImportRow(dr);
                    }
                    else
                    {
                        if (!dtExistUsers.Rows.Contains(dr))
                        {
                            dtExistUsers.ImportRow(dr);
                        }
                    }
                }
            }

            
            string errorUsers = "";
            foreach (DataRow dr in dtExistUsers.Rows)
            {
                errorUsers += dr[ddlUserNameTitle.SelectedValue] + ";";
            } 

            string msg = "执行操作完毕:成功导入" + dtAddUsers.Rows.Count + "条;失败导入" + dtExistUsers.Rows.Count + "条。";
            if (dtExistUsers.Rows.Count > 0)
            {
                msg += " 失败名单:" + " " + errorUsers;
            }
            MessageBox.Show(this, msg);

        }

  

补充:用到的两个关键变量

        /// <summary>
        /// 从Excel导入的全部Sheet表数据
        /// </summary>
        private DataSet dsExcel = null;

        /// <summary>
        /// 选中要处理的用户表数据
        /// </summary>
        private DataTable dtUsers = null;

以上是部分主要核心代码,其它代码可以参考网上现有代码。如有问题可以留言讨论学习。

猜你喜欢

转载自blog.csdn.net/admans/article/details/82906100