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

 

 

平时我们用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 只保留有数据的sheetfor (int i = 0; i < ds.Tables.Count; i++){DataTable dt = ds.Tables[i].Copy();//必须复制表才能添加到新的DataSettry{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;

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题三十八之将s所指字符串中除了下标为偶数、同时ascii值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

C#+Signalr+Vue实现B站视频自动回复评论,当一个最懒程序员!

Part1前言前几天刷到了程序员鱼皮的自动回复视频评论的视频&#xff0c;于是我也想来试试&#xff01;Part2开始第一步打开想要自动回复评论的视频url&#xff0c;打开调试模式&#xff01;然后找到可以触发评论的网络请求可以看到我们的oid是可以唯一确定视频的id,那么这个oid…

一张图不用,纯CSS 做个生日贺卡

朋友生日了&#xff0c;直接画&#xff0c;炫技并且表示本人闲的全身疼才会去拿CSS画画&#xff0c;以此嘲弄对方的加班&#xff1a; 既然贺卡做出来了&#xff0c;那就顺便介绍一下贺卡制作流程吧&#xff0c;其实也不是什么技术&#xff0c;也就是CSS 拼拼拼就可以了&#…

C语言试题三十九之将s所指字符串中除了下标为奇数、同时ascii值也为奇数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

The type android.support.v4.view.ScrollingView cannot be resolved. It is indirectly referenced from

前几天另一个项目使用RecyclerView控件&#xff0c;引用类库然后继承一切都很顺序 详细&#xff1a;http://www.cnblogs.com/freexiaoyu/p/5022602.html 今天打算将另一个项目的ListView控件也替换成RecyclerView以同样的方式引用了RecyclerView,引用地址请点击上面的链接查看 …

Mysql索引的类型和优缺点

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)&#xff0c;它们包含着对数据表里所有记录的引用指针。注&#xff1a;[1]索引不是万能的&#xff01;索引可以加快数据检索操作&#xff0c;但会使数据修改操作变慢。每修改数据记录&#xff0c;索引就必须刷…

Android Notification总结

Android Notification总结 目录[-] &#xfeff;&#xfeff;一、通知的主要功能 二、通知简介 三、通知的使用流程 四、使用NotificationCompat.Builder设置通知的属性&#xff1a; 五、管理通知 &#xfeff;&#xfeff;一、通知的主要功能 显示接收到短消息、即使消息等信…

C#-Linq源码解析之Any

前言在Dotnet开发过程中&#xff0c;Any作为IEnumerable的扩展方法&#xff0c;十分常用。本文对Any方法的关键源码进行简要分析&#xff0c;以方便大家日后更好的使用该方法。使用Any 确定序列中是否包含元素或存在元素满足指定条件。看这样一个例子&#xff0c;我们判断集合中…

python_getopt解析命令行输入参数的使用

[cpp] view plaincopyprint? import getopt import sys config { "input":"", "output":".", } #getopt三个选项&#xff0c;第一个一般为sys.argv[1:],第二个参数为短参数&#xff0c;如…

五、登录页倒计时制作《仿淘票票系统前后端完全制作(除支付外)》

一、登录功能的实现 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 上一节我们已经完成了基本页面的制作&#xff0c;在本节中&#xff0c;我们将会开始完成登录功能的实现。 实现登录功能需要增加一个用户组件&#xff1a; 这个用户组件是需要选择…

【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据

配套实验数据包下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1T4zUFmCIOCKIisdGRQPddg?pwdddi1 文章目录1. 调用importdata函数读取文件中的数据2. 调用importdata函数读取文件数据&#xff0c;返回结构体变量x3. 调用importdata函数读取文件中的数据&#xff0c…

TextView的部分点击事件和点击事件

1.在TextView中实现部分点击 我在activity中使用了clickablespan这个类&#xff0c;然后完全按照视频上的操作下来&#xff0c;发现点击时不响应&#xff0c;于是我便设置了电话的链接&#xff0c;发现这时点击 自己设置的区域就会响应&#xff0c;但是如果我把电话链接删了&am…

C语言试题四十之使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

Meta http-equiv属性详解

Meta http-equiv属性详解 博客分类&#xff1a; Web综合HTML浏览器IECache搜索引擎 http-equiv顾名思义&#xff0c;相当于http的文件头作用&#xff0c;它可以向浏览器传回一些有用的信息&#xff0c;以帮助正确和精确地显示网页内容&#xff0c;与之对应的属性值为content&am…

MAUI 入门教程系列(3.多目标平台)

前言如果您是第一次创建MAUI项目, 并且在之前也并没有接触过Xamarin.Forms应用, 或许你并不知道MAUI的强大优势, 在原来的Xamarin.Forms当中, 我们基于不同平台的项目他们是单独维护的。如下所示:因为如此, 你需要维护不同平台的项目。包括每个项目当中包含的资源、图像、属性定…

关于质量的联想:消费示范效应

IT业界有新闻说&#xff0c;根据可靠性数据研究专家Rescue.com发布的今年一季度可靠性报告&#xff0c;“五大电脑公司中&#xff0c;联想-IBM的分数高居首位&#xff0c;第二名是华硕&#xff0c;之前的可靠性冠军苹果跌落第三&#xff0c;东芝、惠普-康柏则排在第五”。大部分…

六、注册页功能制作《仿淘票票系统前后端完全制作(除支付外)》

一、注册块内容制作 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 上一节已经知道了如何制作登录块内容&#xff0c;但是咱们先做还没有注册&#xff0c;所以就测试不了登录块功能&#xff0c;现在咱们同样的&#xff0c;在注册块中添加一个变量和一…

【MATLAB统计分析与应用100例】案例002:matlab使用xlsread函数读取excel中的数据

文章目录 1. 读取文件excel表中单元格A2:H4中的数据2. 读取excel第1个工作表中单元格A2:C3中的数据,将数据分别加1后返回3. 读取excel第1个工作表中单元格A2:H2中的数据,将读取到的数据分别加1,返回数值矩阵num,文本矩阵txt,元胞数组raw,变换后数值矩阵X1. 读取文件excel…

美图秀秀首页界面按钮设计(二)

本文实现美图秀秀首页中的按钮&#xff0c;它包含3张图片和一个文本。通过开发按钮&#xff0c;我们可以学到iOS的自定义控件&#xff0c;绘制图片和文本的知识。【声明&#xff1a;本博客只能用作学习用途&#xff0c;不得用于商业用途&#xff0c;图片资源均来自官方&#xf…