VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

vfp如何利用odbc存取Excel的sheets

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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    文章主題: 引言回覆

怎麼沒人理我 Sad Sad Sad
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 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 Smile

只是VFP的連結字串好像與VB的有所不同

**以上連結都能成功,但下列函數都失敗,請問各位大大工作表名稱如不填工作表名字該填什麼?
SQLEXEC(SQL_STR,"SELECT * FROM [工作表名稱]")
SQLCOLUMNS(SQL_STR,[工作表名稱])

不論工作表名稱是否加"$"都不行 Crying or Very sad

請各位大大指點 Wink
回頂端
檢視會員個人資料 發送私人訊息
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工作表名稱$]"
這樣就查下來了 Smile

另外vfp 的 SQL ALTER能不能用在Excel Driver上,我試不出來 Crying or Very sad
回頂端
檢視會員個人資料 發送私人訊息
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
文章: 2157


第 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來做了
我又有時間來玩一些東西了
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 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 次修改
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作