  | 
				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 文章: 2160
 
  第 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 文章: 2160
 
  第 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 文章: 2160
 
  第 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 文章: 564 來自: 臺灣
  第 14 樓
  | 
		
			
				 發表於: 星期四 一月 08, 2015 1:09 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				各位,我解決了Sqltable()抓取sheetname這個問題了。
 
請參考http://yujngchuang.pixnet.net/blog/post/405294328/ _________________ 大家好,請多指教
   nelsonchuang 在 星期四 一月 08, 2015 2:39 pm 作了第 1 次修改 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |