现在的位置: 首页 > 综合 > 正文

VFP导成EXCEL每次只能导16384行的解决方法

2018年09月27日 ⁄ 综合 ⁄ 共 6647字 ⁄ 字号 评论关闭

以下是在网上找的一些内容,我是用的下面的

COPY TO TEST.CVS TYPE CVS方法解决的

 

为什么用VFP导成EXCEL每次只能导16384行?

*-----------------------------------------

VFP的数据库,记录数为4万多,用文件-导出-选择文件类型为EXCEL,为什么导出的只有16384行;
用换一个数据库,记录数为2万多,用文件-导出-选择文件类型为EXCEL,导出的还是只有16384行
(第一行保留给字段标题,实际导出记录为16383)
---------------------------------------------------------------
方法一:用VFP9.0执行如下语句:

COPY TO TEST.XLS TYPE XL5

注:可以输出最多 65,536 行(但其中有一行保留给字段标题),因为目前EXCEL最多支持 65,536 行
Excel 8.0 (Excel 97)之前的版本只能显示前 16,384 行,并且不能导入超过 32,767 行的文件。

---------------------------------------------------------------

方法二:

导成 CSV 文件,记录没有限制,用EXCEL一样打开,但EXCEL最多能查看65,536行,因为目前EXCEL最多支持 65,536行

copy to test.csv type csv

但导成CSV有如下限制:
- 逻辑字段转换为 F/T 而不是 FALSE/TRUE.
- 如果一个字符字段只包括数值且值中包括前导的零, Excel 转换它为数值型的值 (如 \"00000100\" => 100).
特别是字段是一个专用关键字且你又要在稍后从Excel 文件转换回 VFP 时,这样会有问题。

---------------------------------------------------------------

方法三:
如果你的数据中都是普通的数值和字符串类型,直接用Excel打开表,然后“另存为”一个Excel就可以了。
这样最多可以保存65,536 行(但其中有一行保留给字段标题),因为目前EXCEL最多支持 65,536 行
---------------------------------------------------------------

方法四:用代码导

* Excel 5 和 Excel 95 有一个限制就是一张工作表只能有 16,383 行.
* 该限制在 Excel 97 和 Excel 2000 是 65,536 行.
* 由于没有 TYPE XL8 命令, VFP 只能复制最初的 16,383 条记录.
* 该程序处理该限制并允许复制用户机器上的 Excel 版本所支持的记录数.

&& DbfToExcel.PRG
&& 记得要安装Excel啊,否则不好用
&& BY Foxer(狐狸)

CLOSE DATABASES ALL
SET DATE YMD
SET CENTURY ON
cDbfFile = GETFILE(\"dbf\")
IF EMPTY(cDbfFile)
RETURN
ENDIF
USE (cDbfFile) ALIAS FoxTable IN 0
IF NOT USED(\"FoxTable\")
=MESSAGEBOX(\"打开表失败,程序将中止!\", 16, \"Error\")
RETURN
ENDIF
cExcelFile = PUTFILE(\"保存为(&N):\",JUSTSTEM(cDbfFile)+\".xls\",\"xls\")
IF EMPTY(cExcelFile)
CLOSE DATABASES ALL
RETURN
ENDIF
SELECT FoxTable
oExcelSheet = GETOBJECT(\"\",\"Excel.Sheet\") && 产生Excel对象
IF NOT TYPE(\"oExcelSheet\") = \"O\"
=MESSAGEBOX(\"Excel对象创建失败,程序将中止!\", 16, \"Error\")
RETURN
ENDIF
oExcelApp = oExcelSheet.APPLICATION
oExcelApp.Workbooks.ADD()
oExcelApp.ActiveWindow.WINDOWSTATE=2
oSheet = oExcelApp.ActiveSheet
nFldCount = AFIELDS(aFldList, \"FoxTable\")
FOR i = 1 TO nFldCount
oSheet.Cells(1,i).VALUE = aFldList[i, 1]
ENDFOR
cRecc = STR(RECCOUNT(\"FoxTable\"))
SCAN
WAIT WINDOW ALLTRIM(STR(RECNO())) + \"/\" + cRecc NOWAIT
FOR i = 1 TO nFldCount
vValue = .NULL.
IF AT(aFldList[i, 2], \"CDLMNFIBYT\") = 0
LOOP
ENDIF
cFldName = aFldList[i, 1]
vValue = EVALUATE(cFldName)
DO CASE
CASE aFldList[i, 2] = \"C\" && 字符/字符串
vValue = TRIM(vValue)
CASE aFldList[i, 2] = \"D\" && 日期
vValue = DTOC(vValue)
CASE aFldList[i, 2] = \"T\" && 日期时间
vValue = TTOC(vValue)
CASE INLIST(aFldList[i, 2], \"N\", \"F\", \"I\", \"B\", \"Y\") && 数值
CASE aFldList[i, 2] = \"L\" && 逻辑
CASE aFldList[i, 2] = \"M\" && 备注型
OTHERWISE
vValue = .NULL.
ENDCASE
IF VARTYPE(vValue) = \"C\" AND EMPTY(vValue)
LOOP
ENDIF
IF NOT ISNULL(vValue)
oSheet.Cells(RECNO(\"FoxTable\")+1, i).VALUE = vValue
ENDIF
ENDFOR
ENDSCAN
cChrStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"
FOR i = 1 TO nFldCount
cColumn = SUBSTR(cChrStr, INT((i-1)/26), 1) + SUBSTR(cChrStr, IIF(MOD(i, 26)= 0, 26, MOD(i, 26)) , 1)

oSheet.COLUMNS(cColumn + \":\" + cColumn).COLUMNWIDTH = 12
IF aFldList[i, 2] = \"M\"
oSheet.COLUMNS(cColumn + \":\" + cColumn).WrapText = .F.
ENDIF
ENDFOR
oExcelApp.ActiveWorkbook.SAVEAS(cExcelFile)
oExcelApp.ActiveWorkbook.CLOSE(.F.)
oExcelApp.ActiveWorkbook.CLOSE(.F.)
oExcelApp.QUIT
oExcelSheet = .NULL.
oExcelApp = .NULL.
WAIT CLEAR
=MESSAGEBOX(\"转换完毕!\", 64, \"OK\")
CLOSE DATABASES ALL

程序是用VFP8写的,在VFP6中也可以,没有问题。只要能够执行完成,就会是正确的,行数只受你安装的Excel最大行数限制,至少65,536行

这个程序支持所有字段类型(通用型除外),包括MEMO类型字段。

--------------------------------------------------------------

方法五:

xlQuery=exlapp.ActiveSheet.QueryTables.Add(\"OLEDB;Provider=VFPOLEDB;Data Source=\"+ipath+\";Mode=Share Deny None;Password=\'\';Collating Sequence=MACHINE\", exlapp.Range(\"A2\"), \"select * from table\")

此种方法不支持包含MEMO超长的数据
---------------------------------------------------------------

 
修改

删除

举报

引用

回复

发表于:2008-01-02 14:52:313楼 得分:45
方法六:

如何复制多于 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

抱歉!评论已关闭.