【数据传输 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 ...
随机推荐
- 堆参数-XMS 与-XMX的说明
XMS : JVM初始分配的堆内存 XMX : JVM最大允许分配的堆内存,按需分配 堆内存分配: JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64: JVM最大分配的堆内存由-Xmx指 ...
- 关于c#的结构体struct与class的区别
C# 结构体 struct C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中 ...
- 013、BOM对象的应用
BOM结构图如下: DOM结构图如下: BOM和DOM BOM,Bowser Object Model浏览器对象模型.提供了访问和操作浏览器各组件的途径或方法. 比如:Navigator对象:浏览器的 ...
- jQuery选择器之表单元素选择器
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- word打印小册子
使用联想m7250f打印册子,打印时设置该打印机属性为双面打印(手动),打印第一面后,将所有打印出的纸拿出并翻转使对应word中的第2页的打印纸朝外,之后将所有纸放入纸盒,再点击打印第二面即可.
- 跟随鼠标指针跑的div拖拽效果
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- HDU 5381 The sum of gcd (技巧,莫队算法)
题意:有一个含n个元素的序列,接下来有q个询问区间,对每个询问区间输出其 f(L,R) 值. 思路: 天真单纯地以为是道超级水题,不管多少个询问,计算量顶多就是O(n2) ,就是暴力穷举每个区间,再直 ...
- 写的一个HttpClient类
package com.ca.test.cainterface.common.util.http; import com.ca.test.cainterface.common.util.data.Da ...
- 课外作业(建立double类型的小数,按照四舍五入保留2位小数)
举例:
- 最短路 || Codeforces 938D Buy a Ticket
题意:从城市u到v(双向)要花w钱,每个城市看演唱会要花不同的门票钱,求每个城市的人要看一场演唱会花费最少多少(可以在这个城市看,也可以坐车到别的城市看,然后再坐车回来) 思路:本来以为是多源..实际 ...