* 程序………..: 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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。