|
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才會更有趣~
############################# |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|