|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
tatame
註冊時間: 2003-05-21 文章: 6
第 1 樓
|
發表於: 星期三 五月 21, 2003 10:54 am 文章主題: vfp如何利用odbc存取Excel的sheets |
|
|
論壇上都是討論使用ole的方式
請問vfp如何利用odbc存取Excel的sheets
以下是我的方式:
GET_FILE_N=GETFILE("XLS")
DECLARE INTEGER SQLConfigDataSource IN odbccp32 INTEGER,; INTEGER, STRING, STRING
lnWindowHandle=0
lcODBCDriver ="Microsoft Excel Driver (*.xls)"
lcODBCName ="TEST_EXCEL"
lcODBCFileName= GET_FILE_N
settings="DSN="+ lcODBCName+ CHR(0) +;
"Description=" + lcODBCDesc+ CHR(0) +;
"DBQ="+ lcODBCFileName + CHR(0)
lreturn=SQLConfigDataSource(lnWindowHandle, 1, lcODBCDriver,settings)
SQL_STR = SQLSTRINGCONNECT("DSN="+lcODBCName+";uid=admin")
IF SQL_STR>0
MESSAGEBOX("成功連結至"+lcODBCFileName)
ELSE
MESSAGEBOX("失敗")
quit
return
ENDIF
**以上連結都能成功,但下列函數都失敗,請問各位大大工作表名稱如不填工作表名字該填什麼?
SQLEXEC(SQL_STR,"SELECT * FROM [工作表名稱]")
SQLCOLUMNS(SQL_STR,[工作表名稱]) |
|
回頂端 |
|
|
tatame
註冊時間: 2003-05-21 文章: 6
第 2 樓
|
發表於: 星期一 五月 26, 2003 3:35 pm 文章主題: |
|
|
怎麼沒人理我 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2158
第 3 樓
|
發表於: 星期一 五月 26, 2003 11:21 pm 文章主題: |
|
|
這個問題沒人用過, VB是沒問題VFP就不可以, 以下是我找到的資料
* FOR VB
Dim Con As Object, Res As Object
Set Con = CreateObject("ADODB.Connection")
Set Res = CreateObject("ADODB.Recordset")
Con.Open ("DRIVER=Microsoft Excel Driver (*.xls);DBQ=c:\classmate.xls")
Res.Open "[sheet1$]", Con
'Excel工作表名稱 + $ 才是Table的名稱喔
For i = 0 To Res.Fields.Count - 1
Print Res.Fields(i).Name,
Next
Print
Do Until Res.EOF
For i = 0 To Res.Fields.Count - 1
Print Res.Fields(i).Value,
Next
Print
Res.MoveNext
Loop
******************************
利用VFP語法改寫就是不行, 有用 sqltables( sql_str , 'TABLE' ) 結果傳回空的TABLE, 表示VFP抓不到後端資料, 所以無法使用ODBC存取EXCEL _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
tatame
註冊時間: 2003-05-21 文章: 6
第 4 樓
|
發表於: 星期一 六月 02, 2003 1:26 pm 文章主題: |
|
|
用SQLTABLES(SQL_STR,"'TABLE','SYSTEM TABLE'")可傳回各SHEET的名稱,表示VFP抓的到後端資料,所以ODBC應該可以存取EXCEL的TABLE
只是VFP的連結字串好像與VB的有所不同
**以上連結都能成功,但下列函數都失敗,請問各位大大工作表名稱如不填工作表名字該填什麼?
SQLEXEC(SQL_STR,"SELECT * FROM [工作表名稱]")
SQLCOLUMNS(SQL_STR,[工作表名稱])
不論工作表名稱是否加"$"都不行
請各位大大指點 |
|
回頂端 |
|
|
ruby
註冊時間: 2003-06-03 文章: 25
第 5 樓
|
發表於: 星期二 六月 03, 2003 5:55 pm 文章主題: |
|
|
不曉得這是什麼方法,但我都是用此方式是抓EXCEL資料,再存入資料庫中,當然也有指令可以直接將資料抓入,但有時不適合用指令時,就用以下方式一筆筆抓,例如EXCEL檔的第一列不抓(表頭)
xx=GETOBJECT("","Excel.Application")
sh=xx.application
sh.Workbooks.Open("C:\TEST.xls")
for k=1 to 1
mname= sh.Sheets(k).Name &&找尋第一個工作表名稱
sh.Sheets(mname).Select
sh2=sh.activesheet &&目前正執行之工作表
sh2.Columns("A:B").NumberFormatLocal = "@" &&文字型態
sh.ActiveCell.SpecialCells(11).Select &&跳至最後一列
jj=sh.ActiveCell.row() &&求最後一列值
for i=jj to 2 step -1 &&(第1列表頭不抓)
ms_name=sh2.Cells(i,'A').value
if type('mpt1no')='N'
ms_name=str(ms_name)
endif
ms_name=alltrim(ms_name)
ms_addr=sh2.Cells(i,'B').value
if type('ms_addr')='N'
ms_addr=alltrim(str(ms_addr))
endif
endfor
endfor
sh.quit &&結束excel
不曉得有沒有雞同鴨講,因我不知你為什麼抓EXCEL資料要用SQL指令抓 _________________ ruby |
|
回頂端 |
|
|
tatame
註冊時間: 2003-05-21 文章: 6
第 6 樓
|
發表於: 星期二 六月 03, 2003 6:11 pm 文章主題: |
|
|
感謝ruby大大,提供方法
因為用SPT的方式應該是存取速度最快的,又簡單.短短幾行即可, |
|
回頂端 |
|
|
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 7 樓
|
發表於: 星期六 一月 24, 2004 3:12 pm 文章主題: |
|
|
你可以將以下程式測試
代碼: | lcDSNLess="Driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;DBQ=d:\test3.xls; DriverID=278"
STORE sqlstringconnect(m.lcDSNLess) TO gnConnHandle
IF gnConnHandle <= 0
= MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error')
ELSE
= MESSAGEBOX('Connection made', 48, 'SQL Connect Message')
ENDIF
= SQLSETPROP(gnConnHandle, 'asynchronous', .F.)
= SQLEXEC(gnConnHandle, "INSERT INTO [sheet1$] (Cu_No,Cu_Name) VALUES ('01','BBBB')")
= SQLEXEC(gnConnHandle, "SELECT * FROM [sheet1$] ", "MyCursor")
BROWSE
= SQLEXEC(gnConnHandle, "DELETE FROM [sheet1$] ")
= SQLDISCONNECT(gnConnHandle) |
_________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
|
tatame
註冊時間: 2003-05-21 文章: 6
第 8 樓
|
發表於: 星期六 二月 07, 2004 12:35 pm 文章主題: |
|
|
謝謝ruby大大,還持續關心此議題
重點在==> SQLEXEC(gnConnHandle, "SELECT * FROM [sheet1$] ", "MyCursor") 裡的中括弧"[Excel工作表名稱$]"
這樣就查下來了
另外vfp 的 SQL ALTER能不能用在Excel Driver上,我試不出來 |
|
回頂端 |
|
|
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 9 樓
|
發表於: 星期一 五月 10, 2004 1:40 pm 文章主題: |
|
|
引言回覆: |
另外vfp 的 SQL ALTER能不能用在Excel Driver上,我試不出來
|
這是無解的題目!! _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2158
第 10 樓
|
發表於: 星期三 七月 20, 2005 11:39 pm 文章主題: |
|
|
資料來源: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetother_excel_driver_programming_details.asp
Driver Keywords Required Examples
Microsoft Excel 3.0 or 4.0 Driver, DriverID
Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\temp; DriverID=278
Microsoft Excel 5.0/7.0 Driver, DriverID, DBQ
Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\temp\sample.xls;DriverID=22
Microsoft Excel 97 Driver, DriverID, DBQ
Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\temp\sample.xls;DriverID=790
********************************
** 建立一個新的EXCEL sheet
lcDSNLess="Driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;DBQ=c:\temp\test.xls; DriverID=278"
STORE sqlstringconnect(m.lcDSNLess) TO gnConnHandle
? SQLEXEC(gnConnHandle, "CREATE TABLE demo (Name TEXT,Age NUMBER)")
*? SQLEXEC(gnConnHandle, [INSERT INTO demo (Name,Age) VALUES ("陸小曼",26)]) &&--錯誤: 字串不可以用"
? SQLEXEC(gnConnHandle, [INSERT INTO demo (Name,Age) VALUES ('陸小曼',36)]) &&--字串須用'
? SQLEXEC(gnConnHandle, [INSERT INTO demo (Name,Age) VALUES ('史嘉富',41)])
? SQLEXEC(gnConnHandle, "INSERT INTO demo (Name,Age) VALUES ('徐志摩',38 )")
? SQLDISCONNECT(gnConnHandle) &&--閉閉連線, 存檔
***利用ODBC讀取excel的sheet
lcDSNLess="Driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;DBQ=c:\temp\test.xls; DriverID=278"
STORE sqlstringconnect(m.lcDSNLess) TO gnConnHandle
? gnConnHandle
? SQLEXEC(gnConnHandle, "select * from demo")
BROWSE
? SQLEXEC(gnConnHandle, "select Name,Age from demo order by age")
BROWSE
? SQLDISCONNECT(gnConnHandle) &&--閉閉連線 _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 11 樓
|
發表於: 星期四 七月 21, 2005 1:41 am 文章主題: |
|
|
真地嗎?
那麼寫一些東西,就不一定要用jsp來做了
我又有時間來玩一些東西了 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2158
第 12 樓
|
發表於: 星期四 七月 21, 2005 3:50 pm 文章主題: |
|
|
經過實際測試過, 可用ODBC來存取EXECL工作表,
有些SPT的屬性, EXCEL並不支援, 須要到我說的資料來源那裡查.
親自試用,就知效果! _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
Chris Lee
註冊時間: 2004-03-23 文章: 32
第 13 樓
|
發表於: 星期五 七月 22, 2005 3:55 pm 文章主題: |
|
|
可支援 alter table,並非無解:
x = sqlstringconnect("Driver={Microsoft Excel Driver (*.xls)};Dbq=C:\1.xls;readonly=false")
? sqlexec(x, "alter table [sheet1$] add column c1 char(10)")
? sqldisconnect(x)
create table 亦可,方式一樣,請類推。
此外,以 ODBC 存取 Excel 會有一些限制,例如:
不支援記錄刪除(可用 select [想要的記錄] 來模擬),
不支援 stored procedure,
單一 table 記錄最多僅能容納 65535 筆。
Chris |
|
回頂端 |
|
|
nelsonchuang
註冊時間: 2003-09-04 文章: 563 來自: 臺灣
第 14 樓
|
發表於: 星期四 一月 08, 2015 1:09 pm 文章主題: |
|
|
各位,我解決了Sqltable()抓取sheetname這個問題了。
請參考http://yujngchuang.pixnet.net/blog/post/405294328/ _________________ 大家好,請多指教
nelsonchuang 在 星期四 一月 08, 2015 2:39 pm 作了第 1 次修改 |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|