导读:我们知道,在数据库中,数据集DataSet是由多张DataTable表组成。所以,如果我们需要将数据从外部导入到数据库中,那么要做的很重要的一步是将这些数据转换为数据库可以接受的结构。今天在用SQLBulkCopy 实现不同数据库服务器之间的数据导入时,其中有一个很重要的点:所有能够转成DataSet或者DataTable的数据,都可以使用SQLBulkCopy去实现批量导入......现在,就介绍这第一步,将Excel表中的数据转换为DataTable类型。

一、基础概述

如何定义表结构

目的:在实现代码中本来事先定义的是DataSet,后来取出数据填充了DataTable,帮助理解这一个过程。

刚开始创建的表没有表结构,要定义表的结构,必须创建DataColumn对象并将其添加到表的Columns集合中。在为DataTable定义了结构之后,通过DataRow对象将数据添加到表的Rows集合中。如:

将数据写入DataSet:

<span style="font-family:KaiTi_GB2312;font-size:18px;">//创建一个新的空班级DataSet
DataSet dsClass = new DataSet();
//创建班级表
DataTable dtClass = new DataTable("Class");
//创建班级名称列
DataColumn dcClassName = new DataColumn("ClassName",typeof(string));
className.MaxLength = 50;
//创建年级ID列
DataColumn dcGradeID = new DataColumn(GradeID",typeof(int));
//将定义好列添加到班级表中
dtClass.Columns.Add(dcClassName);
dtClass.Columns.Add(dcGradeID);
//将班级表添加到DataSet中
dsClass.Tables.Add(dtClass);</span>

将数据从DataSet里面取出

从DataSet中获取数据有两种方式:

<span style="font-family:KaiTi_GB2312;font-size:18px;">
1.第一种方式是通过指定DataSet中的具体DataTable的某行某列来获取数据。
步骤:
1.通过表名,从DataSet中获取指定的DataTable
2.通过索引,从DataTable中获取指定的DataRow
3.通过列名,从DataRow中获取指定列的数据
例:
//得到班级名称
dsClass.Table["Class"].Row[0]["ClassName"];
//得到年级ID
dsClass.Tables["Class"].Row[0]["GradeID"] </span>

2.另一种方式是将DataSet中的数据直接绑定到数据展示控件上。如:DataGrid等

二、实现代码

2.1,主方法(简单实现)

注意:这个方法只是简单实现,并没有做过多的细节处理,如:上传文件的大小限制,扩展名的处理等。

<span style="font-family:KaiTi_GB2312;font-size:18px;">   /// <summary>
/// 将Excel表中的数据转换为DataTable
/// </summary>
/// <param name="path">源文件路径</param>
/// <returns></returns>
public DataTable invertTotable(string path)
{
string strMessage = string.Empty;
Response.Buffer = true;
Response.Clear();
Response.Flush();
DataTable dt = null;
//关键的连接语句 HDR=yes 第一列为列名
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
if (ds.Tables.Count > 0)
{
dt = ds.Tables[0];
Response.Write("Excel数据加载完毕!");
Response.Flush();
}
else {
Response.Write("Excel数据加载失败!");
}
return dt;
}</span>

2.2,后台触发事件

<span style="font-family:KaiTi_GB2312;font-size:18px;"> protected void Button1_Click(object sender, EventArgs e)
{
string path = Request.Form["myFile"].ToString();
//string strUserPath = AppDomain.CurrentDomain.BaseDirectory + path;
//查了很多方法没能实现直接获取文件地址,本次实验在于封装Excel转换为DataTable,所以没有做过多的纠结,先写死
string path1 = "C:\\Users\\10283\\Desktop\\" + path;
GridView1.DataSource = invertTotable(path1);
GridView1.DataBind();
}</span>

2.3,前台页面代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestExcel.aspx.cs" Inherits="TestExcel.TestExcel" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>将Excel转换为datatable</title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server"></asp:GridView>
<br/>
<input id="File1" type="file" name="myFile"/>
<asp:Button ID="Button1" runat="server" Text="导入" OnClick="Button1_Click" />
</form>
</body>
</html></span>

2.4,实现效果

三、主方法说明

3.1,需要引入的命名空间

using System.Data;

using System.Data.OleDb;

using System.Data.SqlClient;

using System.Data.Sql;

3.2,未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

这是由于本地的Office版本和程序中要求的版本不统一,需要下载数据库连接组件安装,进行注册表注册。下载地址:http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe

3.3,文件与要求的格式不统一

导入的文件必须是标准的XLS或者是XLSX文件,否则将会导致程序运行失败。

四、总结反思

上午在进行批量导入的时候,有一个疑问,如果是多张表导入呢?事实上,通过DataSet可以合并多个DataTable表,所以,先将Excel表都转成DataTable类型,再和并这些DataTable就可以解决。

更多实现:http://blog.csdn.net/lmdcszh/article/details/8625083


【数据传输 2】批量导入的前奏:将Excel表中的数据转换为DataTable类型的更多相关文章

  1. vlookup函数基本使用--如何将两个Excel表中的数据匹配;excel表中vlookup函数使用方法将一表引到另一表

    vlookup函数基本使用--如何将两个Excel表中的数据匹配:excel表中vlookup函数使用方法将一表引到另一表 一.将几个学生的籍贯匹配出来‘ 二.使用查找与引用函数 vlookup 三. ...

  2. Jmeter----读取excel表中的数据

    Jmeter 读取excel数据使用的方法是使用CSV Data Set Config参数化,之后使用BeanShell Sampler来读取excel表中的数据 第一步.查看所需的接口都要哪些字段和 ...

  3. 复制excel表,往excel表中写入数据

    import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...

  4. 【PHP】将EXCEL表中的数据轻松导入Mysql数据表

    在网络上有不较多的方法,在此介绍我已经验证的方法. 方法一.利用EXCEL表本身的功能生成SQL代码 ①.先在“phpmyadmin”中建立数据库与表(数据库:excel,数据表:excel01,字段 ...

  5. 将EXCEL表中的数据轻松导入Mysql数据表

    转载自:http://blog.163.com/dielianjun@126/blog/static/164250113201042310181431/ 在网络上有不较多的方法,在此介绍我已经验证的方 ...

  6. 将Excel表中的数据导入MySQL数据库

    原文地址: http://fanjiajia.cn/2018/09/26/%E5%B0%86Excel%E8%A1%A8%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5% ...

  7. Python xlrd模块读取Excel表中的数据

    1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...

  8. sql server数据库将excel表中的数据导入数据表

    一般有两种方法可以实现,一种是直接写sql语句,另外一种是利用sqlserver的管理工具实现.这里介绍的是后面一种方法. 步骤: 一.准备数据 1.将excel表另存为文本格式,注意文本格式需为ta ...

  9. 将Excel表中的数据导入到数据库

    网上查到的有参考价值的就一家,自己调试发现可行.感谢原创文章:将Excel中数据导入数据库(一) using System; using System.Collections.Generic; usi ...

随机推荐

  1. 转 python 将一个文件中内容添加到另一个文件指定位置

    http://blog.csdn.net/huguangshanse00/article/details/14624601

  2. Datapatch AND What to do if the status of a datapatch action was not SUCCESS due to finding non-ignorable errors

    1. Enterprise Manager: Starting version 12.1 Enterprise Manager now calls datapatch to complete post ...

  3. Backbone学习记录(2)

    创建一个集合 1)new Backbone.Collection()方式 var user=new Backbone.Model({'name':'susan'}); var list=new Bac ...

  4. Oracle历史版本及oracle相关软件下载地址

    网站:https://edelivery.oracle.com/ 可能需要注册个账号!!!(账号注册登录自己折腾下就好了) 下载数据库或者oracle的相关软件的话,如下 选择对应的下载即可!

  5. QQ面板拖拽(慕课网DOM事件探秘)(下)

    2.鼠标事件坐标获取 function fnDown(event) { var event = event || window.event; var oDrag = document.getEleme ...

  6. BOM学习-javascript计时器小结

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. Hibernate核心接口和工作原理

    Hibernate核心接口和工作原理 Hibernate有五大核心接口,分别是:Session .Transaction .Query .SessionFactory .Configuration . ...

  8. EJB2的配置

    1. ejb-jar.xml <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns=&q ...

  9. LINUX 安装tsung 对OPENFIRE 进行压力测试

    参考资料:  http://www.centoscn.com/image-text/install/2014/0818/3503.html  http://my.oschina.net/jieluck ...

  10. win7创建无线(WIFI)cmd命令

    1.创建无限热点:netsh wlan set hostednetwork mode=allow ssid=name key=12345678. 2.承载网络:netsh wlan start(关闭s ...