前言:

上篇博客介绍了SqlBulkCopy类批量操作数据库的相关操作,最后提到了可以使用这个类实现excel文件导入数据库,接下来我做简单介绍。

首先说一下思路:

  1. 把excel中的数据读出来并放入到DataTable中。
  2. 使用SqlBulkCopy类的方法批量导入数据库。

虽然只用简单的两部。但是我们需要考虑的问题还是用很多的,其中很重要的一点就是判断需要导入即excel中的数据是否合法,包括:是不是为空,是不是太长,是不是有重复,导入的字段是否对应。看起来挺吓人的,其实思路还是最重要的。只要敢想什么都能实现。

下面我简单的写一个小例子来说明一下。

多余的不说,直接到点击导入按钮:

        protected void btnImportTeacher_Click(object sender, EventArgs e){//成员业务逻辑层MemberInfoBLL  memberInfo = new MemberInfoBLL() ;//BLL层把Excel转化为datatable类CreateExcelDataBLL  createExcelData = new CreateExcelDataBLL();//将错误信息导出到Excel           DataTableToExcel dataTableToExcel = new DataTableToExcel();/*-------------------------------------准备Excel文件--------------------------------------*///获取上传文件地址string url = fupImportTeacher.PostedFile.FileName.ToString();if (url == ""){//数据源为空,弹出提示:请选择Excel文件!Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择Excel文件!');</script>");return;}string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名DataTable dtAllMember;//在系统中建文件夹up,并将excel文件另存this.fupImportTeacher.SaveAs(Server.MapPath("~\\UploadFile") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中//获得文件路径string strpath = Server.MapPath("~\\UploadFile") + "\\" + urlLocation;//把上传的Excel转换为datatabledtAllMember = createExcelData.CreateExcelDataSource(strpath);

以上代码涉及到的类包括CreateExcelDataBLL  、DataTableToExcel

/********************************************************************************文    件:CreateExcelDataBLL.cs*作    者:韩义*所属小组:图书馆维修管理系统*文件说明:基础系统-把excel转化为datatable*创建日期:2013年1月23日9:43:16*修改作者:*修改日期:*修改描述:*版 本 号:V1.0*版本号变更记录:
********************************************************************************/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//引用各命名空间
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;namespace BLL
{public class CreateExcelDataBLL{//构造方法public CreateExcelDataBLL(){}/// <summary>/// 传入excel路径,转换为datatable/// </summary>/// <param name="url"></param>/// <returns></returns>public DataTable CreateExcelDataSource(string url){//定义一个DataTable数据表DataTable dt = null;//获得excel数据string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";//从Excel表的Sheet1单元格获取数据string strSql = "select * from [Sheet1$]";OleDbConnection oleConn = new OleDbConnection(connetionStr);OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);try{//把Excel数据填充给DataTabledt = new DataTable();oleAdapter.Fill(dt);//返回数据表return removeEmpty(dt);}catch (Exception ex){throw ex;}finally{oleAdapter.Dispose();oleConn.Close();oleConn.Dispose();//删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)if (File.Exists(url)){File.Delete(url);}}}/// <summary>/// 循环去除datatable中的空行/// </summary>/// <param name="dt"></param>protected DataTable removeEmpty(DataTable dt){List<DataRow> removelist = new List<DataRow>();for (int i = 0; i < dt.Rows.Count; i++){bool rowdataisnull = true;for (int j = 0; j < dt.Columns.Count; j++){if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim())){rowdataisnull = false;}}if (rowdataisnull){removelist.Add(dt.Rows[i]);}}for (int i = 0; i < removelist.Count; i++){dt.Rows.Remove(removelist[i]);}return dt; }}
}
/********************************************************************************文    件:DataTableToExcel.cs*作    者:韩义*所属小组:图书馆维修管理系统*文件说明:基础系统-把datatable转化为excel*创建日期:2013年1月23日10:43:16*修改作者:*修改日期:*修改描述:*版 本 号:V1.0*版本号变更记录:
********************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入命名空间
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
namespace BLL
{public class DataTableToExcel{/// <summary>/// 导出Excel/// </summary>/// <param name="dt"></param>/// <param name="ExportFileName"></param>public void ToExcel(DataTable dt){DataGrid dgExcel = new DataGrid();dgExcel.DataSource = dt;dgExcel.DataBind();HttpContext.Current.Response.Charset = "GB2312";string fileName = HttpUtility.UrlEncode(Guid.NewGuid().ToString(), System.Text.Encoding.UTF8);string str = "attachment;filename=" + fileName + ".xls";HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;HttpContext.Current.Response.ContentType = "application/ms-excel";HttpContext.Current.Response.AppendHeader("content-disposition", str);StringWriter sw = new StringWriter();HtmlTextWriter htmTextWriter = new HtmlTextWriter(sw);dgExcel.RenderControl(htmTextWriter);HttpContext.Current.Response.Write("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");string style = "<style>td{mso-number-format:\"\\@\";}</style>";//防止导出excel时将以0开头的全数字数据的0去掉HttpContext.Current.Response.Write(style);HttpContext.Current.Response.Write("</head><body>");HttpContext.Current.Response.Write(sw);HttpContext.Current.Response.Write("</body></html>");HttpContext.Current.Response.End();}}
}

两个类的作用我想通过上面的解释大家都应该明白他们的作用了。

        验证excel中数据的有效性:

下面介绍如何验证excel中数据的有效性。

            /*-------------------------------------判断数据源是否合法--------------------------------------*///定义要求的字段数据string[] headfields = { "成员姓名","学号","身份等级","小组名称","密码","性别","年龄","手机号","QQ号","邮箱","备注"};//判断dtAllTeacher中是否包含全部要求的字段for (int i = 0; i < headfields.Length; i++){//只要有一个字段不被包含,则提示"数据源缺少必要的字段",并退出循环和整个方法if (!dtAllMember.Columns.Contains(headfields[i])){Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('数据源缺少必要的字段,请检查Excel数据源!');</script>");//退出方法return;}}//判断数据源中是否有数据if (dtAllMember.Rows.Count == 0){Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('Excel文件中没有任何数据,请填充数据!');</script>");//退出方法return;}//判断是否有相同学号的行DataView dvTeacher = new DataView(dtAllMember);if (dvTeacher.Count != dvTeacher.ToTable(true, "学号").Rows.Count){Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('Excel中有相同的学号,学号不能相同!');</script>");//退出方法return;}DataSet dsMember = new DataSet("dt_Member"); //创建一个名为dt_Member的DataSet//手动创建的新数据表-学生数据表DataTable dtAddMember = new DataTable("dt_AddMember"); //创建一个名为dt_AddMember的DataTalbe//为dt_AddMember表内建立Column(表头),添加数据列:dtAddMember.Columns.Add(new DataColumn("memberName", typeof(string)));dtAddMember.Columns.Add(new DataColumn("memberStudentID", typeof(string)));dtAddMember.Columns.Add(new DataColumn("level", typeof(string)));dtAddMember.Columns.Add(new DataColumn("groupID", typeof(string)));dtAddMember.Columns.Add(new DataColumn("memberPW", typeof(string)));dtAddMember.Columns.Add(new DataColumn("sex", typeof(string)));dtAddMember.Columns.Add(new DataColumn("age", typeof(string)));dtAddMember.Columns.Add(new DataColumn("phone", typeof(string)));dtAddMember.Columns.Add(new DataColumn("qq", typeof(string)));dtAddMember.Columns.Add(new DataColumn("email", typeof(string)));dtAddMember.Columns.Add(new DataColumn("explian", typeof(string)));                     //新建数据表用于存放错误数据DataTable dtErrorRow = new DataTable();//为dtErrorRow创建列dtErrorRow.Columns.Add(new DataColumn("成员姓名", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("学号", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("身份等级", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("小组名称", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("密码", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("性别", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("年龄", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("手机号", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("QQ号", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("邮箱", typeof(string)));dtErrorRow.Columns.Add(new DataColumn("备注", typeof(string)));            dtErrorRow.Columns.Add(new DataColumn("错误原因", typeof(string)));//从上传的Excel转换为的datatable表中取出数据,放入成员信息。for (int intRow = 0; intRow < dtAllMember.Rows.Count; intRow++){        //成员姓名strMemberName = dtAllMember.Rows[intRow]["成员姓名"].ToString();//成员姓名memberStudentID = dtAllMember.Rows[intRow]["学号"].ToString();strLevel = dtAllMember.Rows[intRow]["身份等级"].ToString();strGroupName = dtAllMember.Rows[intRow]["小组名称"].ToString();strmemberPW = dtAllMember.Rows[intRow]["密码"].ToString();strSex = dtAllMember.Rows[intRow]["性别"].ToString();strAge = dtAllMember.Rows[intRow]["年龄"].ToString();strPhone = dtAllMember.Rows[intRow]["手机号"].ToString();strQQ = dtAllMember.Rows[intRow]["QQ号"].ToString();strEmail = dtAllMember.Rows[intRow]["邮箱"].ToString();strExplian=dtAllMember.Rows[intRow]["备注"].ToString();               //根据小组名称判断,小组是否存在Boolean  bFlag = false;//判断输入的组名是否存在bFlag = new BLL.GroupInfoBLL().ExistsByName(strGroupName);                // IDif (bFlag ==true ){//小组ID为--韩义strGroupID = new BLL.GroupInfoBLL().GetModelByGroupName(strGroupName).groupID;}//否则将当前行添加到错误列表并跳出当前循环else{                    //向错误列表中添加当前行AddErrorRow(dtErrorRow, "指定的组名称不存在");//跳出当前循环continue;}               //判断成员ID是否存在bFlag = false;//定义标识变量//判断学号是否存在bFlag = new BLL.MemberInfoBLL().Exists(memberStudentID);//如果指定的成员代码已存在则将当前行添加到错误列表,并跳出当前循环if (bFlag==true ){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "指定的成员已存在");//跳出当前循环continue;}//判断性别类型是否正确if (strSex != "男" && strSex != "女"){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员性别错误");//跳出当前循环continue;}//判断身份等级是否正确if (strLevel !="组员"){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "导入成员身份级别只能为“组员”,组长请在系统中指定");//跳出当前循环continue;}//判断是否包含密码信息if (strmemberPW ==""){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员密码不能为空");//跳出当前循环continue;}//判断是否包含电话信息if (strPhone ==""){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员手机号不能为空");//跳出当前循环continue;}//判断是否包含邮箱信息if (strEmail ==""){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员邮箱不能为空");//跳出当前循环continue;}//判断是否包含学号信息if (memberStudentID == ""){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员学号不能为空");//跳出当前循环continue;}//判断是否包含姓名信息if (strMemberName  == ""){//向错误列表中添加当前行AddErrorRow(dtErrorRow, "成员姓名不能为空");//跳出当前循环continue;}//添加成员信息表的新行DataRow drAddMember = dtAddMember.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。//学生信息表对应的各列值drAddMember["memberName"] = strMemberName;drAddMember["memberStudentID"] = memberStudentID;drAddMember["level"] = strLevel;drAddMember["groupID"] = strGroupID;drAddMember["memberPW"] = strmemberPW;drAddMember["sex"] = strSex;drAddMember["age"] = strAge;drAddMember["phone"] = strPhone;drAddMember["qq"] = strQQ;drAddMember["email"] = strEmail;drAddMember["explian"] = strExplian;               dtAddMember.Rows.Add(drAddMember);  //将一整条数据写入表中             }//将表加入DataSet中:成员信息dsMember.Tables.Add(dtAddMember);//将DataSet中数据表导入数据库Boolean flagImportMember = memberInfo.ImportMember(dsMember);//判断成员是否导入成功if (true == flagImportMember && dtErrorRow.Rows.Count == 0){//导入成功,弹出提示Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('成员信息导入成功!');</script>");}else if (false == flagImportMember){//导入失败,弹出提示Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('成员信息导入失败!');</script>");}else if (true == flagImportMember && dtErrorRow.Rows.Count != 0){//只有部分数据导入成功,弹出提示Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('成员信息只有部分导入成功,有错误的部分已导出为EXCEL,请查看新导出的EXCEL;新导出的Excel修改错误后可作为数据源重新导入');</script>");//将错误数据导出到Excel并打开显示dataTableToExcel.ToExcel(dtErrorRow);}}

说明:以上代码中建立了两个表一个用于导入:字段改为与数据库对应,另一个表用于导出:字段改为汉字说明。其中memberInfo.ImportMember方法就是实现数据库的批量导入,这在上一篇博客中已经有介绍了这里就不再累述了。

        总结:

原来感觉挺难的东西,现在都已经完整的总结了出来。体会挺深的,什么东西首先不能被吓住,平常心态对待每一个新知识,总会找到熟悉的身影,总有那么个头绪让你一点一点屡清楚了。

转载于:https://www.cnblogs.com/suncoolcat/p/3402618.html

使用SqlBulkCopy类实现导入excel表格相关推荐

  1. php导入excel表格数据,php页面导入excel表格数据-php导入excel 怎么获取excel表格数据...

    PHP如何导出当前页面中的表格至Excel 常用的用PHP读取EXCEL的方法有以下三种,各自有各自的优缺点.个人推荐用第三种方法,因为它可以跨平台使用. 1. 以.csv格式读取 将.xls转换成. ...

  2. java操作mysql导表_Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; impor ...

  3. 导入excel表格识别表格中数据得到一个List集合

    导入excel表格识别表格中数据得到一个List集合 1.先注入相关依赖 如果是用eclipse开发的项目的话就需要去下载对应的jar包导入才行. <dependency><grou ...

  4. java 导入excel表格(批量导入),下载excel模板,导出表格

    1.导入excel表格(批量导入) 如图,给id=83和id=84的老师导入工作时间. 导入的excel模板如下 注意导入excel表格时关于日期时间类的的数据要设置对应的格式. 后台接口 /*** ...

  5. 导入excel表格到数据库、导入excel表格到数据库代码、根据excel表格路径将数据导入到数据库、验证要导入的excel表格数据、根据路径获取MultipartFile、FileItem文件

    导入excel表格到数据库.根据路径导入excel表格到数据库代码.根据excel表格路径将数据导入到数据库.验证要导入的excel表格数据.根据路径获取MultipartFile.FileItem文 ...

  6. matlab绘图 excel,『在matlab上如何导入excel表格然后画图』excle表格如何使用绘图笔...

    excel怎样在绘制图形中加入文字 1.在excel表制图形中加入文以添加文字,首先绘制图形,图形绘制好图形,并选择"编辑文字",输入文字即可. 1.1插入图形, 1.2,选择所需 ...

  7. php excel导入数据库显示乱码,php修改excel表格数据库数据格式-使用phpexcel导入excel表格数据到MYSQL,乱码怎么解决...

    PHP 用PHPExcel往数据库导入大量数据 估计0是null,所以不显示了,可以换个思路,让他显示为字符串 $number = 0; echo ''.$number 原生PHP代码实现excel导 ...

  8. 如何在ex表格导入php_怎么使用php把表格中的数据导入到excel中,php如何快速导入excel表格数据...

    php怎么导入大量数据的excel php导出数据的Excel: PHP从数据库分多次读取100万行记录,和分将100万入文本文件都没问题 Excel可以支100万行记录,Excel 2003最大支持 ...

  9. Navicat怎样导入Excel表格和txt文本的数据

    Navicat怎样导入Excel表格数据 1. 准备excel数据表,第一行是字段名,第二到五行是数据 (1.当需要存储的字段为null时,对应的单元格不写  2.注意数据是在哪个工作表中,例如:下面 ...

  10. 如何将excel表格导入word_PPT怎样导入Excel表格?PPT导入Excel表格方法

    PPT一直是我们最常使用的演示文稿,而Excel又是我们在办法中最常使用的表格软件,当我们想要在演示PPT中添加表格时,可以将Excel表格完成之后再导入到PPT演示,这样会使PPT看起来非常美观,那 ...

最新文章

  1. Thrift抛直接内存OOM一点解决思路
  2. 点分治问题 ----------- HDU6881 Tree Cutting or 2020杭电多校第10场 [点分治+思维]
  3. AliCloudDB for redis应用场景之存储最新N条聊天记录
  4. 微服务架构下的测试之道
  5. 2016012017+小学四则运算练习软件项目报告
  6. 10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令
  7. JZOJ 5710. 【北大夏令营2018模拟5.13】Mex
  8. 详解微信开放平台第三方平台代小程序开发业务基本接口调用逻辑
  9. liferay 调用ajax
  10. 开发手记之实现web.config的快速配置(转载)
  11. 修改 gcc 和 g++ 的默认版本
  12. 【华为云技术分享】ARMv8-A存储模型概述(1)
  13. dv算法java实现_各种排序算法的分析及java实现(二)
  14. Shell编程之一:Shell基础编程
  15. 【笔试/面试】—— 不使用大于、小于、if 语句,实现 max 宏
  16. 内核运行之前访问IO
  17. 高德地图android离线包下载,高德地图(车机版)离线包下载与安装
  18. 【LeetCode】460 and 1132(LFU缓存机制)
  19. 计算机内部的单位换算(内存)byte B KB MB GB TB
  20. JavaScript 中的事件类型5(读书笔记思维导图)

热门文章

  1. IntelliJ IDEA 13怎么创建JAVA SE项目
  2. 从HDFS看分布式文件系统的设计需求
  3. sql 二进制文件的导入导出
  4. 【笔记】android 系统常用user id列表
  5. Ubuntu 下搭建 Android 开发环境(图文)
  6. 吴彦祖计算机系统班 百度网盘,哪位吴彦祖(来自伸手党的夸赞) 有老詹的那场g6的百度云盘录像啊?我很需要...
  7. BZOJ3639 Query on a tree VII
  8. 小程序学习笔记(5)-目录结构介绍
  9. springboot图片上传和显示_Jeewx-Boot 1.1 版本发布,基于SpringBoot的开源微信管家系统...
  10. 计算机管理模糊,电脑显示器显示有点模糊怎么办