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