C# 导入Excel文件和数据库文件的对比

来源:互联网 发布:可靠性分析软件下载 编辑:程序博客网 时间:2024/06/06 18:49

    前几天做一个项目的时候,需要从外部导入数据,当时数据都在Excel里面,因此在网上学习了很久的导入Excel数据到程序里面的相关知识。发现从Excel文件中导入数据和从数据库导入数据有很多相同点,但也有一些方面的不同,因此对这两者做个对比,更能加深学习的效果。

第一,两个“五步走”:

    从数据库(这儿特指sql server)里获取数据,需要遵循以下步骤:

    首先,导入命名空间:

using System.Data.SqlClient; // 连接SQLServer专用using System.Data;

    第二步,创建连接(需要SqlConnection),一般语法为:

SqlConnection lo_conn = new SqlConnection("Server=服务器名字或IP;Database=数据库名字;uid=用户名;pwd=密码");​
    例如:
SqlConnection lo_con = new SqlConnection();lo_con.ConnectionString = "server=.;database=stu;uid=sa;pwd=sa";​
    此时,并没有真正连接到数据库,还需要再来一步:
lo_conn.Open(); //此时,才真正连接到了数据库。
    第三步,向数据库发送SQL语句,此时需要使用SqlCommand:
SqlCommand lo_cmd = new SqlCommand();   //创建命令对象lo_cmd.CommandText = "这里是SQL语句";   //写SQL语句lo_cmd.CommandType = CommandType.Text;lo_cmd.Connection = lo_con;             //指定连接对象,即上面创建的
    第四步,处理SQL命令或返回结果集,此时需要使用SqlDataReader:
lo_cmd.ExecuteNonQuery();  //这个仅仅执行SQL命令,不返回结果集,实用于建表、批量更新等不需要返回结果的操作。SqlDataReader lo_reader = lo_cmd.ExecuteReader();//返回结果集,以流的形式返回数据​
    或者,第四步,以数据集的方式返回结果集,此时还需要DataSet:
SqlDataAdapter dbAdapter = new SqlDataAdapter(lo_cmd); //注意与上面的区分开,与上面有何区别呢?DataSet ds = new DataSet(); //创建数据集对象dbAdapter.Fill(ds); //用返回的结果集填充数据集,这个数据集可以被能操作数据的控件DataBind

    第五步,关闭连接:

lo_reader.Close();//或者dbAdapter.Close();lo_conn.Close();

    那,从Excel导入数据也需要遵循以下步骤(采用OleDB读取Excel文件的方法,网上还有另外常用的两种,此处,不多介绍):

    第一步,建立连接字符串(与连接数据库时的lo_cmd.ConnectionString一样):

string strCon = string.Format("Provider=Microsoft.Jet.OLEDB.{0}.0;" +                              "Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" +                               "data source={3};",            (fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (hasTitle ? "Yes":"NO"), filePath);
    在这句话中出现的HDR和IMEX的含义:其中HDR用来设置是否将Excel表中的第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。在这儿需要注意:当我们设置IMEX=1时,将强制混合数据转为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,如果某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。

    Excel 2003的连接字符串为:strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";

    Excel 2007/2010 的连接字符串为:strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";

    可以通过后缀名来判断:Excel 2003为.xls,Excel 2007/2010为.xlsx。

    第二步,建立连接(此处用到了OleDBConnection):

OleDbConnection myConn = new OleDbConnection(strCon);
    第三步,建立查询语句(与连接数据库的SQL语句lo_cmd.CommandText一样):
string strCom = " SELECT * FROM [文科$]";
     第四步,以数据集的方式返回结果集(此处用到了OleDBAdapter):
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn)DataSet ds = new DataSet();myCommand.Fill(ds);

    第五步,关闭连接:

myConn.Close();myCommand.Close();
    总结一下,从数据库获取数据的步骤——五步走:

1、导入命名空间;

2、创建连接,此时需要SqlConnection;

3、向数据库发送SQL语句,此时需要使用SqlCommand;

4、处理SQL命令或返回结果集,此时需要使用SqlDataReader;或者以数据集的方式返回结果集,此时还需要DataSet;

5、关闭连接;

    从Excel文件中获取数据的步骤——五步走:

1、建立连接字符串;

2、建立连接,此处用到了OleDBConnection;(注:1、2步相当于从数据库获取数据的第1步)

3、建立查询语句(与连接数据库的SQL语句lo_cmd.CommandText一样);

4、以数据集的方式返回结果集,此处用到了OleDBAdapter和DataSet;

5、关闭连接;

    从这两个“五步走”中,可以发现从数据库中获取数据和从Excel文件中获取数据的过程基本一样;不一样的只是连接字符串以及所使用的连接类不一样,而且这些不一样只是内容的不一样,样式以及作用都类似。

第二,数据怎么用?

    数据库获取数据有两种方式,返回结果集,用到SqlDataReader;或者通过数据集的方式返回结果集,用到DataSet;

    举个例子来说,有一个成绩数据库,程序从成绩数据库获取成绩之后,第一,用于呈现到界面;第二,计算总分及排名;

 

    一、从数据库获取数据呈现到界面,只需要将获取的数据关联到C#提供的数据显示控件,普遍使用的有两类:DataGridView控件及ListView控件,其中DataGridView通过数据源读取数据库,自带增、删、改、查及排序的功能;而ListView的增删改查需要自己手动编写,一般是在需要多种方式显示数据时使用。因此,在功能上,DataGridView更好,但在性能上,ListView更甚一筹。(具体使用见下一篇文章);在此,使用DataGridView控件;

    连接数据库的代码如下:

DataTable GetDataFromSql()        {            SqlConnection conn = new SqlConnection();            conn.ConnectionString = "server=.;database=GK_score;uid=sa;pwd=***";            conn.Open();             SqlCommand cmd = new SqlCommand();            cmd.CommandText = "Select * From bj_score";            cmd.CommandType = CommandType.Text;            cmd.Connection = conn;             cmd.ExecuteNonQuery();            //SqlDataReader reader = cmd.ExecuteReader(); //以流的形式从数据库读取数据            SqlDataAdapter adapter = new SqlDataAdapter(cmd);            DataTable dt = new DataTable();            adapter.Fill(dt);            return dt;                    }DataTable dt2 = GetDataFromSql();dataGridView2.DataSource = dt2;
    读取数据显示如下:


    二、从Excel文件中获取数据并呈现到界面上,也使用DataGridView插件,代码如下:

DataTable GetDataFromExcel(boolean hasTitle = false){    string strCon = string.Format("Provider=Microsoft.Jet.OLEDB.{0}.0;" +                  Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" + "data source={3};",           (fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (hasTitle ? "Yes" : "NO"), filePath);    string strCom = " SELECT * FROM [文科$]";    OleDbConnection myConn = new OleDbConnection(strCon)    myConn.Open();    OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);    myCommand.Fill(ds);    if (ds == null || ds.Tables.Count <= 0) return null;    return ds.Tables[0];}​DataTable dt = this.GetDataFromExcelByConn();dataGridView1.DataSource = dt;

    界面呈现也如上图所示。 

 

0 0