【数据传输 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 ...
随机推荐
- pyspark中使用累加器Accumulator统计指标
评价分类模型的性能时需要用到以下四个指标 最开始使用以下代码计算,发现代码需要跑近一个小时,而且这一个小时都花在这四行代码上 # evaluate model TP = labelAndPreds.f ...
- vs2013转为vs2010项目
1.首先用记事本之类的工具打开.sln文件 打开后会看到如下信息 Format Version 12.00 就是指VS2013 VisualStudioVersion = 12.0.21005.1 指 ...
- 伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件
开发环境:citymaker 7(以下简称cm),jquery,easyui 1.4(界面),visual studio 2012(没有vs,不部署到IIS也行,html文件在本地目录双击打开可用) ...
- 设计 REST API 的13个最佳实践
写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口这件事情就成为了家常便饭,并且,还伴随着无数的争论与无奈.编写友好的 restful api 不论对于你的同事,还是将来作为第三方服 ...
- Kotlin学习的一些笔记
Introduction 写在前面 关于本书 这本书适合你吗? 关于作者 介绍 什么是Kotlin? 我们通过Kotlin得到什么 准备工作 Android Studio 安装Kotlin插件 创建一 ...
- 从源码中无法看出函数所在的js脚本的解决方法
通过设置断点调试使js脚本自动出现
- 微软将于12月起开始推送Windows 10 Mobile
[环球科技报道 记者 陈薇]据瘾科技网站10月8日消息,根据微软Lumia官方Faceboo发布的消息,新版系统Windows 10 Mobile 将会12月起陆续开始推送. 推送的具体时程根据地区. ...
- COGS 1570. [POJ3461]乌力波
★☆ 输入文件:oulipo.in 输出文件:oulipo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 法国作家乔治·佩雷克(Georges Perec,1 ...
- HTML5应用 + Cordova = 平台相关的混合应用
Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署 ...
- C++_pthread read-write lock_读写锁_visual studio 2015下配置
pthread下载地址:https://sourceware.org/pthreads-win32/ 1. 项目->属性->VC++目录 包含目录里添加:pthread所在路径\pthre ...