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

如何複製多於 16,383 條記錄到 Excel 中(轉貼)

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

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


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