ODBC读写EXCEL
使用MSSQL的OleDB访问接口读取Excel数据

--最近在做一个读取Excel文件数据的程序,使用MSSQL对Excel文件及其他数据模式的接口方法--使其数据读取及导出都非常方便--下面讲一下OpenDataSet的使用方法,比较详尽,有需要的人可以参考使用--数据库异构模式,数据互通有无,非常便利--Autor: grjs--Date : 2014-07-27--使用OpenRowSet或者OpenDataSource读取Excel工作簿数据。
(Excel工作簿数据是二维表模式)--首先需要了解一下Excel工作簿的一些特性,比如97-2003版的Excel工作簿最大行数约65500,2007及以上的约104000行--如果在MSSQL2005及更高版本中使用,则可能要将高级功能打开,允许使用访问接口读取外部文件数据--这是微软对数据库的安全性考虑的,执行以下SQL语句即可开启高级功能sp_configure 'show advanced options',1;GORECONFIGURE;GOsp_configure 'Ad Hoc Distributed Queries',1;GORECONFIGURE;GO--如果要取消权限,则执行下面的SQL语句sp_configure 'Ad Hoc Distributed Queries',0;GORECONFIGURE;GOsp_configure 'show advanced options',0;GORECONFIGURE;--注意:--1.开启了这个高级功能,同时访问数据库的用户还必须拥有使用这个访问接口的权限--2.Excel文件必须存放在MSSQL数据库服务器的本地磁盘路径里,路径不能太深,因为这种访问接口不能直接读取远程共享文件--3.使用这种访问接口读取Excel文件数据时,不能先打开相同文件名的Excel,因为访问接口不能读取已经打开的Excel 文件--4.当然MSSQL数据库服务器必须装有Microsoft Office Excel提供Microsoft.Jet.OLEDB.4.0或者Microsoft.ACE.OLEDB.12.0访问接口驱动--5.Excel表格列名不能太复杂,比如含有小括号,则有可能读取不到这列的数据,同样的工作簿名称也不能太复杂--下面以一个商品库存资料的表格为例,其格式如下--编号名称规格条码单位单价数量金额--P20140728001 牛皮腰带 1.2m 109655862356 条33.32 1000 33320--P20140728002 鳄鱼皮鞋40码108565203974 双25.3 2000 50600--P20140728003 T恤L 108520366578 件66.23 1500 99345--P20140728004 红双喜香烟10包装109652800368 条150.32 2000 300640--对应HDR=NO的列名,如下--F1 F2 F3 F4 F5 F6 F7 F8--1.Excel是97-2003版--如果是标准的二维表模式,就是从第一列开始第一行是标题,第二行开始是数据,但是这个列的顺序是重新排列的select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=1;DATABASE=D:\test.xls',[Sheet1$])--指定Excel表格区域读取数据,按原来的列顺序显示select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=1;DA TABASE=D:\test.xls','select * from [Sheet1$A1:R65000]')--如果是第一个工作簿,则可以省略工作簿名称select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=1;DA TABASE=D:\test.xls','select * from [$A1:R65000]')--如果工作簿的名称不规范,例如工作簿名称是23sdf-2342df-23ere3,则要用引号括起,如下使用select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=1;DATABASE=D:\test.xls',['23sdf-2342df-23ere3$'])--2.Excel是2007及更高版,或者操作系统和MSSQL数据库是64bit的,后缀是xls或xlsx的Excel文件都支持select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;IMEX=1;DATABASE=D:\test.xls',Sheet1$) select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;IMEX=1;DA TABASE=D:\test.xls','select * from [$A1:R65000]')select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;IMEX=1;DATABASE=D:\test.xlsx','select * from [$A1:R104000]')--OpenRowSet各项参数说明:--使用的数据访问接口:97-2003版使用'Microsoft.Jet.OLEDB.4.0',2007及更高版使用'Microsoft.ACE.OLEDB.12.0'(64bit 的系统必须使用高版本的)--Excel版本:Excel 5.0--包含标题设置:HDR=YES就是第一行为列标题;HDR=NO即无标题,查询结果为Excel工作簿所有数据,列标题为F1,F2,F3...,列顺序是Excel本来的--IMEX=1:将字符串与数字混合的列强行转为字符串;IMEX=0自动识别数据类型--文件路径:DATABASE--Sheet1$: Excel文件工作簿名称,--如果有的Excel工作簿名称不规范,导致读取时出现问题,则使用'select * from [$A1:R65000]'这种方式,默认读取第一个工作簿的数据--$A1:R65000 : 从A1列到R65000列的所有数据--3.在读取Excel工作簿数据时,有一些问题,比如读取条码,有10个数字组成的条码字符串,但是读取后导入数据表里后,再查询出来就看到变样了--比如条码109655862356,读取之后变成了1.09656E+11,这样的问题要如何处理呢?--如上所示,列F4对应的就是条码,如果出现上述问题,则要对条码字段进行类型转换2次,如下使用select [编号],[名称],[规格],CAST(CAST([条码] AS BIGINT) AS V ARCHAR(20)) as [条码],[单位],[单价],[数量],[金额] from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=1;DA TABASE=D:\test.xls','select * from [$A1:R65000]')--或者select [F1],[F2],[F3],CAST(CAST([F4] AS BIGINT) AS V ARCHAR(20))as [F4],[F5],[F6],[F7],[F8] from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=NO;IMEX=1;DATABASE=D:\test.xls','select * from [$A2:R65000]')--4.读取Excel工作簿数据速度的问题,经过测试,遍历整个工作簿的速度显得慢一些,所以这里可以灵活调整一下,就是先计算出工作簿的数据行数和列数,再确定范围读取数据,这样的速度显然是最理想的--具体参考下面的方法--4.1确定某列数据不能为空,比如编号([F1])不能为空,获取工作簿的数据行数--注:HDR=NO是部含列名,也就是第一行,但是要注意末尾行号则要包含第一行declare @Rows varchar(10),@Start varchar(10)select @Rows=CAST(count(*) AS V ARCHAR(10)) from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=NO;IMEX=1;DATABASE=D:\test.xls','select * from [$A2:A65000]')--注意:使用下面的MSSQL语句获取行数的速度可能很慢,不建议使用set @Rows=CAST(select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 5.0;HDR=NO;IMEX=1;DATABASE=D:\test.xls','select count(*) from [$A2:A65000]')) AS V ARCHAR(10))--4.2获取列数,再通过列数获取对应Excel列的英文字母(这里暂定26个英文字母,超出范围的自己想办法解决),--如何获取列数及对应的字母,让读者自己去实现,这里只给一点思路declare @FCol varchar(2),@LCol varchar(2),@ColumnList varchar(2000)set@ColumnList='1A,2B,3C,4D,5E,6F,7G,8H,9I,10J,11K,12L,13M,14N,15O,16P,17Q,18R,19S,20T,21U,22V,23W,24X,25Y,26Z'--@FCol读取表格的起始列字母,@Start从第几行开始读取,@LCol最后一列对应的字母,@Rows最后一行行号--如果获取到了行数和列对应的字母,那么读取Excel表格数据的速度将提高很多exec('select * from OpenRowSet(''Microsoft.Jet.OLEDB.4.0'',''Excel 5.0;HDR=NO;IMEX=1;DA TABASE=D:\test.xls'',''select * from [$'+@FCol+@Start+':'+@LCol+@Rows+']'')')--5.从数据库表读取数据导入到Excel,则直接使用。
IFIX连接SQL读写数据和制作excel报表图文教程

IFIX连接SQL读写数据和制作excel报表图文教程IFIX连接SQL数据库、制作excel报表详细教程一、 IFIX连接SQL数据库读写数据IFIX连接SQL数据库有多种方法,其中最为方便的两种方法是:(1)使用IFIX本身为SQL数据库提供的接口SQT和SQD;(2)VB+ADO。
下面分别介绍着两种方法的实现步骤。
1、使用SQT和SQD读写SQL数据库1.1 安装SQL2008(只列出关键步骤,其余直接点击“下一步”或“安装”) 打开SQL安装中心,点击“安装”;SQL2008简体中文版安装包下载链接:点击“全新SQL Server独立安装或向现有安装添加功能”;点击“输入产品密匙”,点击“下一步”:(根据版本选择)sql server2008密钥Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBBMicrosoft SQL Server 2008 R2序列号密钥开发版32位:MC46H-JQR3C-2JRHY-XYRKY-QWPVM开发版64位:FTMGC-B2J97-PJ4QG-V84YB-MTXX8工组版:XQ4CB-VK9P3-4WYYH-4HQX3-K2R6QWEB版:FP4P7-YKG22-WGRVK-MKGMX-V9MTM数据中心版32位:PTTFM-X467G-P7RH2-3Q6CG-4DMYB数据中心版64位:DDT3B-8W62X-P9JD6-8MX7M-HWK38企业版32位:R88PF-GMCFT-KM2KR-4R7GB-43K4B企业版64位:GYF3T-H2V88-GRPPH-HWRJP-QRTYB标准版32位:CXTFT-74V4Y-9D48T-2DMFW-TX7CY标准版64位:B68Q6-KK2R7-89WGB-6Q9KR-QHFDW功能选择界面,选择安装全部功能,点击“下一步”;进入实例配置界面,选择默认实例,点击“下一步”;进入服务器配置界面,启动类型均选为“自动”;点击“对所有SQL Server服务使用相同的账户”,在弹出的界面中选择第一个账户,密码不用填;返回服务器配置界面点击下一步;进入数据库引擎配置界面,选择混合模式,输入自己设定的密码,点击“添加当前用户”,点击下一步,直至安装完成,关闭安装中心。
Java读取Excel文件的几种方法

Java读取Excel文件的几种方法最近单位有个项目需要读取excel文件的内容,特别对java读取excel文件的方法做了一点学习,也为了其他人以后能更简单地开发,少走弯路,特写此文,以下程序经过了我的测试,可以保证程序可用,如果你照搬都不行,可能是你的环境有问题。
读取excel文件的常用开源免费方法有以下几种:JDBC-ODBC Excel Driverjxl.jarjcom.jarpoi.jar下面分别对这几种方法分别进行探讨1、JDBC-ODBC Excel Driver这种方法是将excel看成是数据库进行操作,使用SQL Select语句即可查询excel表格。
优点是:不需要第三方的jar包。
如下表样首先在控制面板进行数据源ODBC登记具体方法如下:下面就是代码了。
package xuzhe;import java.io.*;import java.sql.*;//java xuzhe.ExcelJDBCpublic class ExcelJDBC {public static void main(String[] args) throws SQLException{Connection con = null;try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con = DriverManager.getConnection( "jdbc:odbc:ExcelJDBC" );Statement st = con.createStatement();ResultSet rs = st.executeQuery( "Select * from [Sheet1$]" );ResultSetMetaData rsmd = rs.getMetaData();int numberOfColumns = rsmd.getColumnCount();System.out.println ("表格列数"+numberOfColumns );System.out.println( rsmd.getColumnName(1)+ "," +rsmd.getColumnName(2) + "," + rsmd.getColumnName(3));while (rs.next()) {for (int i = 1; i <= numberOfColumns; i++) {if (i > 1) System.out.print(", ");String columnValue = rs.getString(i);System.out.print(columnValue);}System.out.println("");}rs.close();st.close();}catch(Exception ex) {System.err.print("Exception: ");System.err.println(ex.getMessage());}finally {con.close();}}}执行结果如下:2、jxl.jarjxl.jar为开源代码,任何运行java虚拟机的操作系统都能使用这个jar包操作excel表格。
c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件

c#中采⽤OLEDB⽅式来读取EXCEL⽂件和将数据写⼊EXCEL⽂件Microsoft Jet 提供程序⽤于连接到 Excel ⼯作簿。
在以下连接字符串中,Extended Properties 关键字设置 Excel 特定的属性。
“HDR=Yes;”指⽰第⼀⾏中包含列名,⽽不是数据,“IMEX=1;”通知驱动程序始终将“互混”数据列作为⽂本读取。
Excel 8.0 针对Excel2000及以上版本,Excel5.0 针对Excel97。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""注意,Extended Properties 所需的双引号必须还要加双引号。
Provider=Microsoft.Jet.OLEDB.4.0只⽀持Office97-2003,不⽀持2007。
如果需要⽀持2007,使⽤ Provider='Microsoft.Ace.OLEDB.12.0使⽤打开、读取并关闭代码⽰例如下:using System.Data.OleDb;using System.Data;String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=c:/test.xls;" +"Extended Properties=Excel 8.0;";OleDbConnection objConn = new OleDbConnection(sConnectionString);objConn.Open();OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [sheet1]", objConn);OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();objAdapter1.SelectCommand = objCmdSelect;DataSet objDataset1 = new DataSet();//将Excel中数据填充到数据集objAdapter1.Fill(objDataset1, "XLData");objConn.Close();另⼀版本参考代码:string ConnnectionString = string.Format(@"Provider='Microsoft.Ace.OLEDB.12.0';Data Source={0};" + "Extended Properties=Excel 8.0;", ExcelPath);OleDbConnection Excelconn = new OleDbConnection(ConnnectionString);try{Excelconn.Open();OleDbCommand Excelcomm = new OleDbCommand();//这段代码甚⾄可以让Connection重定向,根据实际需要选择该写,如果不需要重定向,From TableName就好了string ExcelCommText = string.Format("select * FROM [Excel 8.0;HDR=yes;DATABASE={0}].[{1}$]", ExcelPath, TableName);OleDbDataAdapter sda = new OleDbDataAdapter(ExcelCommText, Excelconn);DataSet ds = new DataSet();sda.Fill(ds);从上⾯可以看出,使⽤可将Excel当作普通数据库,使⽤SQL语句来操作。
在 VS2008 下操作 Excel 的方法总结

在VS2008 下操作Excel 的方法总结分类:C++/MFC 2009-06-01 11:42 7035人阅读评论(158) 收藏举报这些天做个软件,需要读取Excel 并导入到数据库中,所以研究了一下在VC 下操作Excel 的方法,这里做个总结,以作备忘。
一、最常用的OLE 自动化方式这个方式应该说是功能最全的方式,可能也是应用的最多的方式。
由于这种方式采用的是隐藏启动Office Excel 的方式,所以几乎是全能,任何功能都可以完成。
不过缺点也是比较明显的:1、采用OLE 方式,需要用户计算机上安装有Office Excel,否则就失败;2、由于是隐藏启动Office Excel,而Mcirosoft 的一贯作风就是功能强大、体积巨大无比,所以这个速度是个很大的瓶颈,如果是批量读取的话,那...3、它的基本方法是使用导出 .h 进行OLE 操作,但是网上关于Excel OLE 的完善的参考资料并不是很多,大多也是抄来抄去,所以要想很好的使用它们,恐怕还要好好的探索一下。
不过总之,这种方式在文件数目不多,对功能要求大过速度的话,这是首选。
代码可参考:/hyz_9257/archive/2008/12/27/3621309.aspx二、ADO/ODBC 的方式这种方式需要确保ODBC 中已安装有Excel 表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)",所以同样依赖于Office Excel 是否安装。
常规例子:/document/viewdoc/?id=421这里不得不提的是:新加坡人Yap Chun Wei在CodeProject 上2001 年发布的CSpreadSheet,非常流行的一个Excel 操作类。
地址是:/KB/database/cspreadsheet.aspx具体我在最后第六点来介绍和对比。
三、Sourceforge 上的开源Excel 库搜索了一下,有几个似乎人气比较高,像libXLS,XLSlib 等,下载下来看了一下说明,好像更多是作为php 的插件来使用的,对C++ 似乎没多大帮助。
VC6使用ODBC API操作Excel表的具体步骤

VC6使用ODBC API操作Excel表的具体步骤作者:申屹来源:《电脑知识与技术》2014年第05期摘要:Excel作为普及率最高的办公软件,受到广泛好评,同时Excel具有记录、统计数据的类似数据库的功能,被广泛用于日常的小规模的数据记录和管理。
为了增加对Excel的自动化管理,可以使用c++等语言实现对Excel表的程序访问,提高工作效率。
目前,网络共享资源中,对于ODBC API访问Excel表的介绍非常稀少,也不系统。
该文希望能对这一领域进行补充和整理。
关键词:ODBC API;VC++6;连接数据库;释放资源中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)05-0949-03Abstract:Excel as the most popular office software, was widely praised,then similar database with records, statistical data functions,Widely used for data recording and management of small scale daily. In order to increase the automation management for Excel,you can use the C++ language to achieve the Excel from program access,improve work efficiency. At present, in the network shared resource,accessing the Excel database by ODBC API is very rare,and not a system.I hope this paper can supplement and finishing in this field.Key words:ODBC API;VC++6;Connect to the database;release resources将具体的介绍Vc6环境下,使用ODBC API完成对Excel表,执行建表、添加、删除、追加的操作完整的过程。
VFP调用EXCEL

VFP(Visual Foxpro)是一种关系型数据库管理系统,由于其强大的数据处理能力及良好的兼容性,使其成为数据库应用程序开发人员强有力的工具而广为使用; 而Excel则是一个优秀的电子表格处理软件,在兼容性、操作界面、公式运算、图表等方面有着独到的优势,成为广大办公应用人员必备的首选软件。
上述两种软件在各自的应用领域均得到了广泛的应用,同时上述两种软件还具有良好的交互编程能力,为两者相辅相成、取长补短奠定了良好的基础。
本文将结合实例介绍VFP与Excel交互编程的方法,在VFP中除了使用OLE技术外,还可使用DDE技术与外部服务器进行数据交换,本文主要讲解VFP中使用OLE技术与Excel交换数据,Excel中借助内置的VBA使用VFP提供的Application对象来调用VFP中的一些功能。
其功能可简述如下:VFP数据表“学生成绩.DBF”中含“学号、姓名、语文、数学”等字段,示例程序将从Excel工作簿“VFP交互.XLS”的工作表“查询”中用“条件”区域(一般为一个矩形区中的数据,该区域名称指定为“条件”,数据形如“语文>60”、“数学<90”等)中的数据作为查询的条件,用“连接条件”区域(一般为一个单元格,其值为“or”或者“and”)来获取组合“条件”的逻辑连接,并将该连接信息的内容以工作表的形式显示出来,然后调用VFP中针对给定表的SQL查询来找出给定条件的记录并显示到Excel中。
下列程序均在VFP 6.0与Excel 2000中调试通过。
Excel驱动VFPExcel内置的VBA语言(Visual Basic For Application)为Excel功能的扩展提供了便利的手段,用户可使用该语言直接驱动VFP完成数据检索等功能。
程序首先生成一个VFP对象,然后用VFP的DoCmd方法执行VFP搜索命令串,其搜索结果再借助于VFP的DataToClip方法拷贝至剪切板,最后VBA将其粘贴至工作表的正确位置,为了每次运行时能将结果插入到工作表中,依次对操作的工作表以“搜索结果”、“搜索结果1”等进行编号。
excel中数据源用法

excel中数据源用法Excel是一款非常强大的电子表格软件,具有丰富的功能和强大的数据处理能力。
数据源是Excel中非常重要的一个概念,它可以帮助我们从不同的数据源中导入数据、处理数据和分析数据,极大地提高了我们的工作效率。
本文将阐述数据源在Excel中的用法,包括什么是数据源、数据源的类型、数据源的导入和处理等。
一、什么是数据源数据源是指Excel中用来连接和导入数据的组件,它是指数据存放的地方。
数据源可以是单个文件、数据库、Web服务、文本文件、XML文件等,Excel可以通过设置数据源来连接这些数据源,访问其中的数据,将其导入到Excel工作表中进行处理和分析。
简单来说,数据源是数据的来源,是Excel中与外部数据交换的接口。
二、数据源的类型1. 单个文件数据源:单个文件数据源是指Excel中直接通过打开文件来读取数据的方式,比如Excel文件、文本文件、CSV文件等。
通过单个文件数据源,我们可以导入、编辑和操作单个文件中的数据。
2. 数据库数据源:数据库数据源是一种客户端/服务器式的管理系统,用于存储和管理数据,允许在不同系统之间共享数据。
在Excel中,可以使用ODBC(Open Database Connectivity)桥接器连接数据库数据源,常用的数据库包括Access、SQL Server、Oracle、MySQL等。
3. 应用程序数据源:应用程序数据源是指Excel通过通过调用API来获取数据到Excel中进行数据处理和分析。
常见的应用程序数据源包括:SAP BW、SAP Hana、Microsoft Dynamics、Salesforce、Facebook、Twitter等。
三、数据源的导入1. 通过打开文件导入数据源:这是最简单的一种导入数据源的方式,我们只需打开Excel文件或者文本文件等,选定待导入的工作表或文本文件内容即可将数据源导入到Excel中。
2. 通过数据源向导导入数据源:通过数据源向导可以导入任意类型的数据源,包括XML、数据库、文本、OLAP等,操作步骤如下:(1)打开Excel,点击“数据”选项卡,然后在“获取外部数据”组中,选择“从其他来源获取数据”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)"。
然后,可根据下面步骤进行:
1. 在StdAfx.h文件中加入:
include <afxdb.h>
include <odbcinst.h>
2. 通过ODBC直接创建Excel文件(暂定文件名:Demo.xls)
//创建并写入Excel文件
void CRWExcel::WriteToExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件
CString sSql;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CRE ATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构(姓名、年龄)
sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入数值
sSql = "INSERT INTO demo (Name,Age) VALUES ('徐景周',26)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES ('徐志慧',22)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES ('郭徽',27)";
database.ExecuteSQL(sSql);
}
// 关闭数据库
database.Close();
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
}
END_CATCH_ALL;
}
3. 通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)
// 读取Excel文件
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动"Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!";
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.
sSql = "SELECT Name, Age "
"FROM demo "
"ORDER BY Name ";
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
}
// 获取ODBC中Excel驱动
CString CRWExcel::GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;
// 获取已安装驱动的名称(涵数在odbcinst.h里)
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) return "";
// 检索已安装的驱动是否有Excel...
do
{
if (strstr(pszBuf, "Excel" != 0)
{
//发现!
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0') + 1;
}
while (pszBuf[1] != '\0');
return sDriver;
}。