* 程序………..: 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 |
|