VS2005:可视化的Excel数据库操作即在服务器资源管理器添加Excel表格
PS:有时候,我们可以把Excel当作一个简单的数据来用,就像Access,对于一些数据操作时,这样比直接操作COM封装的Excel组件来的方便。
操作Excel的方式有两种一种通过ODBC,一种直接用OleDb驱动。使用ODBC的方式,我在服务器资源管理器中可以增加Excel表格,但无法进行任何操作,看不见Excel中的工作表。也不可以直接执行SQL语句。
所以只能使用OleDb的方式。先看看OleDb连接Excel的连接字符串
连接字符串
这个连接字符串跟Access的很像(在可视化操作时,选择OleDb驱动,默认连接就是Access),就是多了一个“Extended Properties=Excel 8.0”这句。
我之前一直通过代码的方式连接操作Excel,使用System.Data.OleDb命名空间下的Connection\Adapter\Command。既然代码可以操作,那么VS2005的可视化的数据操作一定也可以。刚开始我通过下图的操作方式没有找到添加Excel的方式。
在“更改数据源”窗口里根本没有OleDb的驱动方式选择,其实是我没有注意,其实期中的第一项连接Access就是OleDb方式。由此可以判断数据源是可以使用OleDb方式的。最终也被我找到。
一)在更改数据源这一步,“数据源”选择“其他”,“在数据提供程序”选择“用于 OLE DB 的 .Net Framework 数据提供程序”,并点击“确定”,这时候数据连接驱动已经是正确的OleDb方式了。如下图所示。
二)再回到“添加连接”窗口后,窗口已经变成OleDb连接方式专用的添加连接窗口。如图所示。在“OLE DB 提供程序”中选择“Microsoft Jet 4.0 OLE DB Provider”(OleDb可以连接数据放方式超多,可以连接各种各样数据源,微软还是很彪悍的)。
三)点击“数据连接”,打开“数据连接属性”窗口,在“连接”选项卡中,点击“…”按钮,进行选择要打开的Excel文件。如图所示。(正如我所说,OleDb方式默认是连接Access,所以在这个窗口,提示也是打开Access文件,但是实际情况是可以打开Excel文件)。
需要注意点,打开文件窗口中,因为默认文件类型是Access文件,需要手动改为“全部文件”或在“文件名”中手动输入“*.xls”这样的文件筛选字符串,并回车。然后才能在窗口中看见你要打开的Excel文件。
四)这时候还没完,OleDb方式默认是打开Access,这时点击“连接测试”肯定是失败的,回想刚才的连接字符串,我们还缺少配置一个属性:“Extended Properties”,它的值应该为“Excel 8.0”。这个属性非常关键,它告诉OleDb程序,打开的数据文件不是Access而是Excel。配置方式是在“数据连接属性”窗口,选择“所有”选项卡。找到“Extended Properties”熟悉,双击,在打开的“编辑属性值”窗口中手动输入“Excel 8.0”,并点击“确定”按钮。如下图所示。
五)在“数据连接点属性”窗口中点击“确定”,保存配置并返回“添加连接”窗口,这时候点击“测试连接”窗口就会提示连接成功了。
六)其他说明:
这个上面操作方式,基本都是通过鼠标操作,只有配置“Extended Properties”属性时需要手动输入下。此操作方式比较简单,容易记住,但也比较繁琐,需要打开好多对话框。如果童鞋嫌麻烦可以直接在“添加连接”窗口中点击“高级”按钮或者在“数据连接属性”的“所有”选项卡。在这两个界面下,都可以直接手动输入OleDb连接字符串属性值。甚至可以在“高级属性”窗口中选择数据驱动程序类型。其实最终要也就两个属性“Data Source”、“Extended Properties”。“Data Source”即为需要打开的Excel文件的路径可使用“|DataDirectory|”这样的路径变量(PS,不懂这个变量的可以百度下)。
八)最终效果,进入上面的操作,便可以在“服务器资源管理”中看见需要操作Excel文件了。可以将表格直接拖到到强类型数据集设计窗口,这样就可以直接在强类型数据集的设计窗口中,进行任何操作。就像操作其他数据库一样。生成的强类型Adapter自动生成了SelectCommand、InsertCommand。超级方便吧。
通过查看强类型自动生成的代码,我们可以看见Excel文件可以使用SQL参数,它的参数还挺特别,直接使用“?”而且问好后面不在加任何字符。
this._adapter.InsertCommand = new System.Data.OleDb.OleDbCommand();this._adapter.InsertCommand.Connection = this.Connection;this._adapter.InsertCommand.CommandText = @"INSERT INTO `Sheet1$` (`姓名`, `身份证号`, `民族`, `学籍号`, `曾用名`, `性别`, `班级`, `国籍`, `港澳台侨胞`, `户籍所在地`, `户籍详细地址`, `户籍地教育主管部门`, `家庭常住地`, `家庭常住地详细地址`, `是否孤儿`, `是否残疾`, `是否寄宿`, `是否留守儿童`, `学习简历`, `第一监护人称谓`, `第一监护人姓名`, `第一监护人联系电话`, `第二监护人称谓`, `第二监护人姓名`, `第二监护人联系电话`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";this._adapter.InsertCommand.CommandType = System.Data.CommandType.Text;
this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("姓名", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "姓名", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("身份证号", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "身份证号", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("民族", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "民族", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("学籍号", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "学籍号", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("曾用名", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "曾用名", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("性别", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "性别", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("班级", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "班级", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("国籍", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "国籍", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("港澳台侨胞", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "港澳台侨胞", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("户籍所在地", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "户籍所在地", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("户籍详细地址", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "户籍详细地址", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("户籍地教育主管部门", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "户籍地教育主管部门", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("家庭常住地", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "家庭常住地", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("家庭常住地详细地址", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "家庭常住地详细地址", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("是否孤儿", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "是否孤儿", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("是否残疾", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "是否残疾", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("是否寄宿", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "是否寄宿", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("是否留守儿童", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "是否留守儿童", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("学习简历", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "学习简历", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第一监护人称谓", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第一监护人称谓", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第一监护人姓名", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第一监护人姓名", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第一监护人联系电话", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第一监护人联系电话", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第二监护人称谓", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第二监护人称谓", System.Data.DataRowVersion.Current, false, null));this._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第二监护人姓名", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第二监护人姓名", System.Data.DataRowVersion.Current, false, null));his._adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("第二监护人联系电话", System.Data.OleDb.OleDbType.VarWChar, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "第二监护人联系电话", System.Data.DataRowVersion.Current, false, null));
PS:
我在互联网上搜索资料的时候Extended Properties属性其实还其他几个配置选项。
Extended Properties="Excel 8.0;HDR=YES;IMEX=0'"
HDR:表示第一行是否为列名。在实际使用过程中,不添加这个属性,还是可以使用Excel表格第一行标注的列名。
IMEX :在网上找到资料如下:
0 is Export mode 为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
1 is Import mode 为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
2 is Linked mode (full update capabilities) 为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
还有一种解释:
即 intermixed,表示混合数据类型时如何处理。Excel 不像 Access 样,Access 每一字段(列)具有数据类型,Excel 不具有,所以 Excel 第一行第一列可以存储字符串,第二行第一列又可以存储数字……同样的列,存储不同的数据类型,这就形成了混合数据类型。如果我们的 Excel 不存在混合数据类型,则可以省略 IMEX;如果我们的 Excel 存在混合数据类型,则需要正确指定 IMEX,否则 OLEDB 很可能错误地判断数据类型,导致读取出来的数据是空白,甚至读取不到行等错误。所以若要读取混合数据类型,应该将 IMEX 设置为 1;若误设置为 0,则读取不到任何行;若误设置为 2 或省略,则有些数据读取出来是空白。注意:输出模式对应写入、输入模式对应读取。
在实际使用中,我操作的Excel文件中每一列都是一种数据类型,这个IMEX我并没有切实体验过。我一般不用这个属性。
其他资料童鞋可以参考(应该是摘自MSDN)
OLEDB Excel INSERT UPDATE SELECT用法
另外推荐一个非常不错SQLite与excel导数据的办法。SQlite是可以使用VS的“服务器资源管理器”进行操作的,Excel也可以。那么互导数据就简单了。首先要创建表结构,这个必须手动操作,没办法像导入导出工具那样自动创建。也可以在VS直接执行Create Table 语句。
然后就是导数据了,导数据非常简单,在源数据表中显示数据,然后全选——复制。到目的表中显示数据——CtrlV。OK