把excel、txt当数据库来查询
Sub excel连接数据库()
Dim Con As New ADODB.Connection
Dim strCon, strsql As String
Dim rs As ADODB.Recordset '设置记录集
Dim i, t, path_
path_ = ThisWorkbook.path & "\"
t = Timer
连接字符串
strCon = "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;imex=0';Data Source=F:\new\v5\11.xlsx"
关联多个文件查询
' strsql = "select a.id,a.firstname,b.lastname from [a1$] a left join [Excel 8.0;hdr=1;imex=1;Database=C:\Users\Administrator\Desktop\a2.xlsx].[a2$] b on a.id=b.id"
表名的表示方式 [] 中括号包起来,里面是sheet名称+$符号
' strsql = "select a.id,a.firstname,b.lastname from [EDM-10$] a left join [a2$] b on a.id=b.id"
有些数字查出来后会变成 1900-01-10 12:00:00,看起来是个日期,处理方式就是*1,让它重新变回数字
strsql = "select a.内部订单号,a.R * 1 from [CNC-11$] a where a.内部订单号 <> '内部订单' "
各种函数的使用,还可以嵌套,但是要注意嵌套的先后顺序,比如这个distinct,要达到真正的效果,就得在最外层
' strsql = " select distinct(UCASE(trim(a.D))) as id from [G-10$] a where a.D <> '内部订单' "
结果集合并,就是一个累加行的过程
' strsql = ""
' strsql = strsql + " select distinct(UCASE(trim(a.D))) as id from [EDM-10$] a where a.D <> '内部订单' "
' strsql = strsql + " union "
' strsql = strsql + " select distinct(UCASE(trim(a.D))) as id from [G-10$] a where a.D <> '内部订单' " Con.Open strCon Set rs = Con.Execute(strsql)
这个是查询所有sheet的名字
' Set rs = Con.OpenSchema(20) 'adSchemaTables= ' Columns("A:A").NumberFormatLocal = "m""月""d""日"";@" For i = To rs.Fields.Count -
Sheets("lcx").Cells(, i + ) = rs.Fields(i).Name
Next i Sheets("lcx").Cells(, ).CopyFromRecordset rs rs.Close
Con.Close Set rs = Nothing
Set Con = Nothing Debug.Print "提取完毕" & "耗时" & Round(Timer - t, ) & "秒" End Sub
需要引用的project有3个:



补充
Sub lcxreaddata()
Dim fname As String, path As String, cnn As Object, rst As ADODB.Recordset, sql As String
使用createobject的方式,不需要引入相应的project,可以直接使用
Set cnn = CreateObject("ADODB.Connection")
fname = "11.xlsx"
path = "F:\new\v5\" & fname
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;imex=0';Data Source=" & path
$符号后面可以加查询的范围
' sql = "SELECT [Actual],[Upper Tol] FROM [Report$a13:f100] where Characteristic='" & cname & "'"
有特殊符号的字段,用中括号括起来就可以使用了,否则需要打开表替换字段名称,关闭的时候还要还原,是不是好傻的操作,都怪以前没有get到这个技能
' sql = " SELECT [新模/修模],[实际产出(H)] FROM [CNC-11$a:r] where [实际产出(H)] <> 0 "
where后面的条件匹配要注意类型,字符串类型的字段用字符串匹配,数字类型的列用数字匹配,否则会报类型不匹配的错误,还有就是,如果两个表关联查询的时候,两个关联的字段的类型必须一致,否则也会报类型不匹配的错误
sql = " SELECT [新模/修模],[实际产出(H)] FROM [CNC-11$a:r] where trim([新模/修模]) <> '' "
Set rst = cnn.Execute(sql)
Sheets.Add
For i = To rst.Fields.Count -
Cells(, i + ) = rst.Fields(i).Name
Next i
Cells(, ).CopyFromRecordset rst
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub
'excel 8.0;hdr=no',此设置决定没有字段名,设置hdr=no时,默认标题字段为F1,F2…………
将EXCEL文件作为数据库连接,实际并不打开EXCEL,
Excel2003版本:cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.Path & "\数据表.xls"
Excel2007版本:cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\数据表.xlsx"
带参数的连接字符串:cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;HDR=yes;IMEX=2';data source=" & ThisWorkbook.FullName
HDR=Yes 代表 Excel 档中的工作表第一行是标题栏,标题只能是一行,不能使多行,或者合并的单元格。
HDR=no 工作表第一行就是数据了,没有标题栏,不使用栏位,则栏位就以f代表,第一列列名就是:f1,第二列列名:f2
IMEX 汇入模式 0 只读 1 只写 2 可读写
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连结模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
Data Source 存储查询数据来源的工作薄名称,数据库路径为:数据表.xls 或本表:& ThisWorkbook.FullName
oledb也能将txt当数据库来查询
Sub 读count_个数求和后写入sum(fpath, fname, sumfile)
Call CreateSchema(fpath, fname, "false", )
Dim cn As Object, rs As Object
Dim strsql As String
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='text;';Data Source=" & fpath
strsql = " select f1,f2,f3,f4,f5,sum(f6) from [" & fname & "] group by f1,f2,f3,f4,f5 order by f1*1,f2*1,f3*1,f4*1,f5*1 "
Set rs = cn.Execute(strsql)
sumfile.Write "列1" & vbTab & "列2" & vbTab & "列3" & vbTab & NW & "个数" & vbTab & ML & "个数" & vbTab & "数量"
sumfile.WriteLine rs.GetString(, , , vbCrLf)
这个一定要记得关,否则当txt数据量庞大的时候,比如我测试的时候,用的3个50万行数据的txt,一个一个按顺序读,如果不关,就会很卡,关了就会很顺畅
rs.Close
cn.Close
Set rs = Nothing
Set Con = Nothing
Call KillSchema(fpath)
End Sub
Sub CreateSchema(fpath, fname, hdr, cc)
Dim fso, MyFile, i
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(fpath & "\schema.ini", True)
MyFile.WriteLine "[" & fname & "]"
MyFile.WriteLine "COLNAMEHEADER = " & hdr
MyFile.WriteLine "Format = TabDelimited"
For i = To cc
MyFile.WriteLine "Col" & i & " = f" & i & " Char"
Next
MyFile.Close
Set fso = Nothing
End Sub
Sub KillSchema(fpath)
Kill fpath & "\schema.ini"
End Sub
如果是标准逗号隔开的txt文件,直接用下面的连接字符串就可以了,就不用写schema.ini文集了
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='text;IMEX=1;HDR=NO;FMT=Delimited;';Data Source=" & ThisWorkbook.Path
schema.ini文件可以定义字段类型,分隔符符号等,在同目录下要建一个Schema.ini说明txt文件的数据格式,例:
[code=INIFile]
[customers.txt]
Format=TabDelimited
ColNameHeader=True
MaxScanRows=
CharacterSet=ANSI
characterset默认就是ansi,所以也可以不用指定
[orders.txt]
Format=Delimited(;)
ColNameHeader=True
MaxScanRows=
CharacterSet=ANSI [invoices.txt]
Format=FixedLength
ColNameHeader=False
Col1=FieldName1 Integer Width
Col2=FieldName2 Date Width
Col3=FieldName3 Char Width
Col4=FieldName4 Float Width
CharacterSet=ANSI[/code]
再说一个查询结果写入txt的示例
Sub 读count_个数求和后写入sum(fpath, fname, sumfile)
Call CreateSchema(fpath, fname, "false", )
Dim cn As Object, rs As Object
Dim strsql As String
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='text;';Data Source=" & fpath
strsql = " select f1,f2,f3,f4,f5,sum(f6) from [" & fname & "] group by f1,f2,f3,f4,f5 order by f1*1,f2*1,f3*1,f4*1,f5*1 "
Set rs = cn.Execute(strsql)
rs.getstring有多个参数,分别是:
rs.GetString(StringFormat,NumRows,ColumnDelimiter,RowDelimiter,NullExpr)
默认的换行符是\n,但是txt的换行符是\r\n,所以如果不设置一下RowDelimiter,打开txt就不会有换行的效果,word打开的话是有换行效果的,word里\n是被识别的
表头用write不用writeline,是因为用writeline会多出一个空行,我估计是因为rs返回的字符串,首行前可能有换行符吧,具体的也没有去研究
sumfile.Write "列1" & vbTab & "列2" & vbTab & "列3" & vbTab & "列4" & vbTab & "列5" & vbTab & "列6"
sumfile.WriteLine rs.GetString(, , , vbCrLf)
rs.Close
cn.Close
Set rs = Nothing
Set Con = Nothing
Call KillSchema(fpath)
End Sub
有很多方式读写数据,但是发现的最快的方式,就是sql,具体为什么,也没有去研究过
还有就是 Microsoft.jet.OLEDB.4.0; 和 Microsoft.ACE.OLEDB.12.0; 两种连接,我的电脑都是支持的,但是有个别电脑不支持jet4.0的,具体原因我也没有去研究过
这些我没有研究过的地方,如果有哪位大神知道的,还望能解答迷惑
把excel、txt当数据库来查询的更多相关文章
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
- 在Excel中使用SQL语句查询和筛选
本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...
- [转]powerDesigner生成excel版本的数据库文件
powerDesigner生成excel版本的数据库文件 出处:http://ray-allen.iteye.com/blog/1893347 脚本 excel 今天收到一个需求,要把数据库设计给一 ...
- Excel 中使用sql语句查询
将Excel连接Oracle数据库 Excel选项板中"数据"—"自其他来源"下拉菜单中有有个可以连接其它数据库的选项"来自数据连接向导"和 ...
- 利用kettle组件导入excel文件到数据库
利用kettle组件导入excel文件到数据库 1. 实现目标 把excel文件内容导入到目标表中:然后用java调用kettle的转换.excel文件的内容仅仅有两列,示比例如以下: wat ...
- python将excel数据写入数据库,或从库中读取出来
首先介绍一下SQL数据库的一些基本操作: 1创建 2删除 3写入 4更新(修改) 5条件选择 有了以上基本操作,就可以建立并存储一个简单的数据库了. 放出python调用的代码: 此处是调用dos 操 ...
- Excel—— [导入到数据库] or 将数据 [导入到Excel]
将Excel导入到数据库实现如下: 前台代码: @model IEnumerable<Model.Student> @{ Layout = null; } <!DOCTYPE htm ...
- SQL语句完成Excel数据导入数据库表中流程方法及注意事项
第一步:先查看数据库是否安装AccessDatabaseEngine_X64.exe, 如下图查看: 如果未安装先下载脚本之家下载地址 https://www.jb51.net/softs/29150 ...
- 104_Power Query 数据库条件查询
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载 1.应用场景 底层数据在数据库(sql server数据库,其他数据库同理,下文不再说明.)中,Excel中有查询的字段,需要 ...
随机推荐
- jquery 1.9以上新版本不支持toggle()的解决方法
原文:http://blog.csdn.net/u011061889/article/details/50397462 参考: http://www.cnblogs.com/lionden/archi ...
- Domino Server installation on Linux (Centos or Redhat) – something somewhere
something somewhere welcome in there…:) Just another techki site howto / Linux / Lotus Domino 0 Domi ...
- Asp.Net实现JS前台带箭头的流程图方法总结!(个人笔记,信息不全)
Asp.Net实现JS前台带箭头的流程图方法总结!(持续更新中) 一.返回前台json格式 json5 = "[{\"Id\":2259,\"Name\&quo ...
- 利用jQuery Ajax技术实现每隔5秒向某页面传值
有时候我们须要每隔一段时间向某页面传值,比方说聊天室,每隔几秒就像数据库处理页面传值并取回,然后显示在聊天窗体.又或者是每隔一段时间就查询用户最后发言时间到如今是否间隔2分钟.假设是则将用户退出. 这 ...
- 寒城攻略:Listo 教你用 Swift 写IOS UI 项目生活记事本
刚才用 Swift 写了一个记事本的应用,仅仅是简单的 UI 方向的开发,先来上产品的界面: 如今 Listo 给分享源码: 共同进步,开源中国.转载请声明出处
- Localhost 回环IP 127.0.0.1
LocalHost 127.0.0.1是一个保留地址,用于本地软件測试以及本地进程间通信, 也叫回环IP.回环地址.回送地址(loopback address).不管什么程序,一旦使 用回环IP发送数 ...
- Java遍历一个文件夹下的全部文件
Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常 ...
- 修改RedHat 7.2 进程最大句柄数限制
RedHat对进程打开文件句柄数主要通过设置全局值和登陆用户分别管理.其中/proc/sys/fs下设置全局最大文件句柄数和用户进程能打开的最大文件句柄数,这两个参数一般情况下不需要修改. 对于普通用 ...
- 把ANSI格式的TXT文件批量转换成UTF-8文件类型
把ANSI格式的TXT文件批量转换成UTF-8文件类型 Posted on 2010-08-05 10:38 moss_tan_jun 阅读(3635) 评论(0) 编辑 收藏 #region 把AN ...
- go语言笔记——多值函数,本质上和nodejs的回调很像,不过nodejs是回调的第一个参数是err,而golang里是第二个!
5.2 测试多返回值函数的错误 Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功:返回零值(或 nil)和 false 表示失败(第 4.4 节).当不使用 t ...