【数据传输 2】批量导入的前奏:将Excel表中的数据转换为DataTable类型
导读:我们知道,在数据库中,数据集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类型的更多相关文章
- vlookup函数基本使用--如何将两个Excel表中的数据匹配;excel表中vlookup函数使用方法将一表引到另一表
vlookup函数基本使用--如何将两个Excel表中的数据匹配:excel表中vlookup函数使用方法将一表引到另一表 一.将几个学生的籍贯匹配出来‘ 二.使用查找与引用函数 vlookup 三. ...
- Jmeter----读取excel表中的数据
Jmeter 读取excel数据使用的方法是使用CSV Data Set Config参数化,之后使用BeanShell Sampler来读取excel表中的数据 第一步.查看所需的接口都要哪些字段和 ...
- 复制excel表,往excel表中写入数据
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...
- 【PHP】将EXCEL表中的数据轻松导入Mysql数据表
在网络上有不较多的方法,在此介绍我已经验证的方法. 方法一.利用EXCEL表本身的功能生成SQL代码 ①.先在“phpmyadmin”中建立数据库与表(数据库:excel,数据表:excel01,字段 ...
- 将EXCEL表中的数据轻松导入Mysql数据表
转载自:http://blog.163.com/dielianjun@126/blog/static/164250113201042310181431/ 在网络上有不较多的方法,在此介绍我已经验证的方 ...
- 将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% ...
- Python xlrd模块读取Excel表中的数据
1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...
- sql server数据库将excel表中的数据导入数据表
一般有两种方法可以实现,一种是直接写sql语句,另外一种是利用sqlserver的管理工具实现.这里介绍的是后面一种方法. 步骤: 一.准备数据 1.将excel表另存为文本格式,注意文本格式需为ta ...
- 将Excel表中的数据导入到数据库
网上查到的有参考价值的就一家,自己调试发现可行.感谢原创文章:将Excel中数据导入数据库(一) using System; using System.Collections.Generic; usi ...
随机推荐
- java 反向工具类
1.ReflectUtil.java package com.example.scansell; import android.util.Log; import java.lang.reflect.C ...
- C51之数据范围
在C51中各数据类型的范围如下:如果宏常量大于65536,则要加UL后缀:乘法运算不能只将结果强制类型转换,而应在被乘数前加(unsigned long)强制转换. 2 因为RAM有限,所以运算量大的 ...
- [转]2010 Ruby on Rails 書單 與 練習作業
原帖:http://wp.xdite.net/?p=1754 ========= 學習 Ruby on Rails 最快的途徑無非是直接使用 Rails 撰寫產品.而這個過程中若有 mentor 指導 ...
- Java基础50题test4—分解质因数
[分解质因数] 题目:将一个正整数分解质因数.例如:输入 90,打印出 90=2*3*3*5. 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰 ...
- CF963A Alternating Sum
思路:利用周期性转化为等比数列求和. 注意当a != b的时候 bk * inv(ak) % (109 + 9)依然有可能等于1,不知道为什么. 实现: #include <bits/stdc+ ...
- Android利用Socket与硬件通信之智能家居APP
前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...
- Angular JS中变量定义的基本原则
在Angular JS开发中,经常需要定义一些变量,关于这些变量的定义方法及作用域应该注意以下几点: 1. 如果能用局部变量解决问题,尽量不要用全局变量. 2. 需要与界面双向绑定的变量采用$scop ...
- 最新精品 强势来袭 XP,32/64位Win7,32/64位Win8,32/64位Win10系统【国庆版版】
本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...
- raid 0 1 5 10 总结的知识点
raid 0 1 5 10 raid 发的别名条带 raid 0 读取性能最高需要磁盘2*N个(N>0)代表所有raid级别中的最高存储性能,其实原理就是把连续的数据分散到多个磁盘上存取,这样, ...
- pylint安装失败的解决方法
原文链接http://www.cnblogs.com/Loonger/p/7815335.html 使用命令pip3 install pylint安装pylint是出现错误.查了一圈也找不到答案.仔细 ...