excel 2000作为一个电子表格软件,它不仅有强大的数据处理能力,而且它的报表功能也是十分强大。因而常常用excel 2000去调用access、sql server、oracle、db2等数据库软件建立的大型数据库的内容。用户可以在工作表中对这些数据进行筛选、排序、查询、编辑和打印报表,十分方便,这也是大多数人都熟悉的。但如何去调用这数据呢?本人在这里提供4种方法。
下面四种方法必须要先创建一个数据源,我们以sql server7.0内的样本数据库pubs为例。在控制面板/odbc数据源/系统dsn,单击增加按纽,选取sql server驱动程序,建立一个与pubs数据库连接的叫pubs名称数据源。
方法一:
在excel 2000中,选择 数据/获取外部数据/新建数据库查询,然后按向导的提示一步一步做,最后将数据返回excel 2000中就行了
这种方法是大家常用的,也是最方便的。但这种方法只能对远程数据进行查询,不能对远程数据进行增加和修改。
方法二:
这种方法需要vba编程(方法三、方法四也一样),在visual basic编程中,我们经常用ado来访问数据。ado是microsoft提供的针对各种各样数据源的新型高级编程接口。它支持大多数据库操作,在excel 2000中应用ado来访问数据,是十分理想的方法。看看下面一个实例:
sub opendb()
dim cn as adodb.connection
dim rs as adodb.recordset
set cn = new adodb.connection
set rs = new adodb.recordset
cn.open "provider=msdasql.1;persist security info=false;data source=pubs"
rs.open "select * from authors", cn
range("a1").copyfromrecordset rs
rs.close
cn.close
end sub
宏中第一、二句定义了一个ado 的connection对象和一个recordset对象,第三、四句创建了一个ado 的connection对象和一个recordset对象。第五句连接到前面我们建立的数据源pubs数据库。第六句是ado 的recordset对象执行一条sql里select语句。在这也可以执行insert,update等等sql语句的。第七句是将rs里的记录返回当前表里。第八、九句是关闭连接。运行前要在excel 2000工具/引用中引用ado的库文件。
在excel 2000中应用ado对象,不仅可以对数据库进行查询,而且可以作增加,修改数据库的记录,甚至可以调用sql server7.0的存储过程,加强excel 2000对数据库处理能力。
方法三:
excel 2000的功能是十分强大的,它自带了一个odbc加载宏,我们在excel 2000中引用这个宏文件xlodbc.xla,就可以通过下面的方法去访问我们建立的数据源了
sub opendb()
dim id as integer
id = sqlopen(“dsn=pubs”)
sqlexecquery id, “select * from authors”
set output = worksheets("sheet1").range("a1")
sqlretrieve id, output, , ,
true sqlclose id
end sub
第二句是调用xlodbc.xla宏中的sqlopen函数建立一个对数据库pubs连接,第三句是sqlexecquery函数执行了一条select语句,id是由 sqlopen 函数返回的唯一连接标识,第四句是sqlretrieve函数将sqlexecquery函数执行的查询的结果返回到excel 2000中。
这种编程方法可以说来的容易,用得方便。也是一种好的访问远程数据方法。
方法四:
这种方法是使用api方法,下面是一个实例
'分配环境句柄
res = sqlallochandle(sql_handle_env, sql_null_henv, henv)
'设置环境属性
res = sqlsetenvattr(henv, sql_attr_odbc_version, sql_ov_odbc3, 0)
'分配数据库连接句柄
res = sqlallochandle(sql_handle_dbc, henv, hsvr)
'连接到数据源
sconnect=“dsn=pubs;database=pubs“
res=sqldriverconnect(hsvr,byval,0&,sconnect,len(sconnect),sconnout, len(sconnout), _ nconnoutlen, 0)
ssql =“select * from authors“
res = sqlexecdirect(hsel, ssql, len(ssql))
'将记录返回当前表里
res=sqlnumresultcols(hsel, nc)
do while (sqlfetch(hsel) <> sql_no_data_found)
j=j+1
for i=1 to nc
res = sqlgetdata(hsel, i, sql_c_char, tmp, 512, pl)
cells(j, i) =tmp
next i
loop
'释放数据库连接句柄
res = sqlallochandle(sql_handle_stmt, hsvr, hsel)
'释放数据库连接句柄
ret = sqlfreehandle(sql_handle_env, henv)
这种方法比较复杂,调试也比较困难,但运行速度快,在进行大量查询数据和自己在api调用方面比较熟时,可以用这个方法。在用上面的实例时,要做api声明和常量的定义。