  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		Ruey
 
 
  註冊時間: 2003-03-12 文章: 1698 來自: tunglo
  第 1 樓
  | 
		
			
				 發表於: 星期四 十一月 20, 2003 10:35 am    文章主題: 如何複製多於 16,383 條記錄到 Excel 中(轉貼) | 
				     | 
			 
			
				
  | 
			 
			
				如何複製多於 16,383 條記錄到 Excel 中 
 
-------------------------------------------------------------------------------- 
 
qxf 於提供, CY 和 rmh 翻譯 
 
VFP 的 COPY TO TYPE XL5 命令只能複製 16,383 條記錄. 該限制是由於 XL5 格式的一張工作表只能有 16,383 行的限制造成的 (參見 MSKB Q103355). 在 Excel 97 和 Excel 2000 中的最大行數是 65,536. 不幸的中在 VFP 中沒有 TYPE XL8 關鍵字. 下面的代碼提供一種簡單的處理辦法. 程式 Copy2Xls 可用於替代 VFP 自己的 COPY TO TYPE XL5 命令. 程式使用了 VFP 6 新增的 TYPE CSV 關鍵字. 如果你使用早期版本的 VFP, 用 FOX2X 替換 CSV 關鍵字. 關於 CSV 與 FOX2X 的區別及一些限制參見程式頭中的注釋. (以下程式用 UT 上的 Mike Hellands great utility mhHtmlCode 程式格式) 
 
 
* 程式...........: Copy2xls.prg 
 
* 作者............: Daniel Gramunt 
 
* 項目...........: common 
 
* 創建...........: 11.10.2000 17:25:06 
 
*) 說明.......: 替換 VFP 自己的 COPY TO TYPE XL5 命令. 
 
*) : Excel 5 和 Excel 95 有一個限制就是一張工作表只能有 16,383 行. 
 
*) : 該限制在 Excel 97 和 Excel 2000 是 65,536 行. 
 
*) : 由於沒有 TYPE XL8 命令, VFP 只能複製最初的 16,383 條記錄. 
 
*) : 
 
*) : 該程式處理該限制並允許複製用戶機器上的 Excel 版本所支援的記錄數. 
 
*) : 
 
*) : 該方案是非常簡單的: 
 
*) : 1. COPY TO TYPE CSV 
 
*) : 2. 打開 CSV 文件並用 Automation 來 SaveAs(tcExcelFile) 
 
*) : 
 
*) : 假定 MS Excel (Excel 97 或以上) 安裝在用戶的機器上 
 
*) : (好, 它將也可處理 Excel 5.0 和 95, 但將使用 16,383 的限制). 
 
*) : 
 
*) : 返回成功導出的記錄數, 否則: 
 
*) : -1 = 缺少參數或參數類型錯誤 
 
*) : -2 = 當前工作區中未打開表 
 
*) : -3 = 記錄數超過最大 Excel 行數 
 
*) : -4 = 用戶不想複蓋已存在的 Excel 檔 (SET SAFETY = ON) 
 
*) : 
 
*) : 性能注意: 在 VFP 中的 COPY TO 命令比起任何 automation 都要快得多. 
 
*) : 但是, 由於我們只用來打開導出的檔並保存為不同格式, 幾乎沒有 
 
*) : 性能損失. 
 
*) : 
 
*) : 
 
* 調用示例....: Copy2Xls("c:\temp\bidon.xls") 
 
* 參數列表....: tcExcelFile - 要創建的 Excel 檔的路徑\檔案名. 
 
* 主要修改....: 26.10.2000: COPY TO FOX2X 和 SaveAs() 代替 
 
* : "組合" 個別的 Excel 檔. 
 
* : 謝謝 UT 的 莈tin Bas鰖 的意見 
 
* : 12.04.2000: COPY TO CSV 代替 FOX2X. 
 
* : FOX2X 有以下限制: 
 
* : - 內碼表 850 的問題 (如字元 "?) 
 
* : - 不支援長檔案名 (雖然很容易處理) 
 
* : - 不支持 datetime 
 
* : CSV 沒有上述問題, 但有其他限制: 
 
* : - 邏輯欄位轉換為 F/T 而不是 FALSE/TRUE. 
 
* : 這不是一個問題, 但為了保持一致性, 我們 
 
* : 對於記錄數沒有超過限制的表, 
 
* : 不再使用 VFP 自己的 COPY TO TYPE XL5. 
 
* : - 如果一個字元欄位只包括數值且值中包括前導的零, 
 
* : Excel 轉換它為數值型的值 (如 "00000100" => 100). 
 
* : 這是一個問題, 特別是欄位是一個專用關鍵字且你又要在稍後從 
 
* : Excel 檔轉換回 VFP 時. 
 
*-------------------------------------------------------------------------------------------------- 
 
LPARAMETER tcExcelFile 
 
 
#INCLUDE FoxPro.h 
 
 
#DEFINE xlWorkbookNormal -4143 && 被 SaveAs() 用來保存於當前 Excel 版本 
 
#DEFINE ccErrorNoParameter "Parameter : 參數丟失失或類型錯誤 (非 ''C'')" 
 
#DEFINE ccErrorNoTableOpen "當前工作區中沒有打開表" 
 
#DEFINE ccErrorToManyRows "記錄數" + ; 
 
ALLTRIM(TRANSFORM(lnRecords, "999,999,999")) +; 
 
") 超過 Excel 最大行數 (" -; 
 
ALLTRIM(TRANSFORM(lnXlsMaxNumberOfRows, "999,999,999"))+; 
 
")" 
 
 
*-- 檢查參數 
 
IF VARTYPE(tcExcelFile) <> "C" OR EMPTY(tcExcelFile) 
 
??CHR(7) 
 
WAIT WINDOW NOWAIT ccErrorNoParameter 
 
RETURN -1 
 
ELSE 
 
tcExcelFile = ForceExt(tcExcelFile, "XLS") 
 
ENDIF 
 
 
*-- 確信在選定的工作區中打開了表或游標 
 
IF EMPTY(ALIAS()) 
 
??CHR(7) 
 
WAIT WINDOW NOWAIT ccErrorNoTableOpen 
 
RETURN -2 
 
ENDIF 
 
 
LOCAL loXls, lnXlsMaxNumberOfRows, lnRecords, lnRetVal, lcTempDbfFile 
 
 
loXls = CREATEOBJECT("excel.application") 
 
*-- 抑制 Excel 的警告和資訊 (類似於 SET SAFETY OFF) 
 
loXls.DisplayAlerts = .f. 
 
*-- 從 Excel 獲取最大行數. 在我們計算工作表中的行數前, 需要添加一個工作簿. 
 
loXls.workbooks.add() 
 
lnXlsMaxNumberOfRows = loXls.ActiveWorkBook.ActiveSheet.Rows.Count - 1 && 1 頭行 
 
 
lnRecords = RECCOUNT() 
 
 
*-- 檢查記錄數是否超過了 Excel 的限制 
 
IF lnRecords > lnXlsMaxNumberOfRows 
 
??CHR(7) 
 
WAIT WINDOW NOWAIT ccErrorToManyRows 
 
*-- 關閉 Excel 
 
loXls.application.quit() 
 
RETURN -3 
 
ENDIF 
 
 
*-- 維持 SET SAFETY 
 
IF SET("SAFETY") = "ON" AND FILE(tcExcelFile) 
 
IF MESSAGEBOX(tcExcelFile + " 已經存在, 複蓋它?",; 
 
MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO 
 
*-- 用戶選擇了 因此退出 
 
*-- 關閉 Excel 
 
loXls.application.quit() 
 
RETURN -4 
 
ENDIF 
 
ENDIF 
 
 
lcTempDbfFile = AddBs(SYS(2023)) + SYS(3) + ".CSV" 
 
 
COPY TO (lcTempDbfFile) TYPE CSV 
 
lnRetVal = _TALLY 
 
 
*-- 打開導出的 CSV 文件 
 
loXls.Application.Workbooks.Open(lcTempDbfFile) 
 
 
*-- 保存為 Excel 檔 
 
loXls.ActiveSheet.saveAs(tcExcelFile, xlWorkbookNormal) 
 
 
*-- 刪除 CSV 檔 
 
IF FILE(lcTempDbfFile) 
 
DELETE FILE (lcTempDbfFile) 
 
ENDIF 
 
 
*-- 關閉 Excel 
 
loXls.application.quit() 
 
 
RETURN lnRetVal 
 
------------------------ _________________ #############################
 
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
 
 
學會VFP使用者社區的搜尋,Code才會更有趣~
 
############################# | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |