以下是在网上找的一些内容,我是用的下面的
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超长的数据
---------------------------------------------------------------
|