把一个 dbf 表导出为 xls 有几种方式?

chinawcs 2009-10-22 02:33:22
为何 在 vfp6.0 里 导出 xls 只有16384行 应该是17510 行 丢了不少
在 vfp9.0 同样操作 结果正常 !!!

我用的 copy to xxx.xls type xls
...全文
429 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Princefei 2009-11-09
  • 打赏
  • 举报
回复
同意5楼说法
chinawcs 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lch3000 的回复:]
vfp6.0下用如下方法可以导出65536 行:
    COPY TO test.xls TYPE FOXPLUS
[/Quote]

果然 好用.
lch3000 2009-10-30
  • 打赏
  • 举报
回复
vfp6.0下用如下方法可以导出65536 行:
COPY TO test.xls TYPE FOXPLUS
chinawcs 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 apple_8180 的回复:]
升级到VFP9.0后,需要将原人低版本的菜单重新生成(Generate)一下,相当于编译。
[/Quote]

用 vfp9.0打开后菜单 提示 升级到最新格式 点 “是” 生成菜单 编译
最后还是报错 看来 升级开发工具 不是这么简单 不知道哪里代码有问题

目前我采用的是 导出CSV格式
everyday1212 2009-10-23
  • 打赏
  • 举报
回复
高人多多啊 :)
学习
十豆三 2009-10-22
  • 打赏
  • 举报
回复
升级到VFP9.0后,需要将原人低版本的菜单重新生成(Generate)一下,相当于编译。
wwwwb 2009-10-22
  • 打赏
  • 举报
回复
提示转换菜单:在VFP9下运行一下,看看问题出在什么地方
chinawcs 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wwwwa 的回复:]
直接的方法就是升级VFP->9
[/Quote]

大哥 我倒想升级到9 用vfp9 打开工程 编译 提示转换菜单 选了是 编译了exe 运行 报错。。
WWWWA 2009-10-22
  • 打赏
  • 举报
回复
直接的方法就是升级VFP->9
wwwwb 2009-10-22
  • 打赏
  • 举报
回复
升级VFP
OR
将表导出为有格式的TXT文件,用EXCEL打开
chinawcs 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwwb 的回复:]
引用 6 楼 chinawcs 的回复:
引用 3 楼 wwwwa 的回复:
有多种方式:
1、直接COPY TO;
2、用EXCEL VBA的COPYFROMRECORDSET;
3、导出为TXT,再导入EXCEL中;
4、用_vfpclip、_CLIPTEXT导入。


如何在vfp6.0 下 导出  xls  支持65536  行

直接COPY TO  怎么用  ?  望明示

需要VFP、EXCEL版本配合
[/Quote]

目前我只有在 vfp6.0下编译 excel 版本倒是高xl8 如何配合
wwwwb 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chinawcs 的回复:]
引用 3 楼 wwwwa 的回复:
有多种方式:
1、直接COPY TO;
2、用EXCEL VBA的COPYFROMRECORDSET;
3、导出为TXT,再导入EXCEL中;
4、用_vfpclip、_CLIPTEXT导入。


如何在vfp6.0 下 导出  xls  支持65536  行

直接COPY TO  怎么用  ?  望明示
[/Quote]
需要VFP、EXCEL版本配合
chinawcs 2009-10-22
  • 打赏
  • 举报
回复
十三豆 真乃神人也!!
cyxin2121921 2009-10-22
  • 打赏
  • 举报
回复
5楼已经说明的很详尽了
cyxin2121921 2009-10-22
  • 打赏
  • 举报
回复
mark
chinawcs 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwwa 的回复:]
有多种方式:
1、直接COPY TO;
2、用EXCEL VBA的COPYFROMRECORDSET;
3、导出为TXT,再导入EXCEL中;
4、用_vfpclip、_CLIPTEXT导入。
[/Quote]

如何在vfp6.0 下 导出 xls 支持65536 行

直接COPY TO 怎么用 ? 望明示
十豆三 2009-10-22
  • 打赏
  • 举报
回复
为什么用VFP导成EXCEL每次只能导16384行?

*-----------------------------------------
Excel 2003 最大行列
256 列 65536 行

Excel 2007 最大行列
16384 列 1048576 行
------------------------------------------

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一样打开,但EXCEL2003最多能查看65,536行,因为目前EXCEL2003最多支持 65,536行(Excel 2007 最大行列:16384 列 1048576 行)

Copy To test.Csv Type Csv

但导成CSV有如下限制:
- 逻辑字段转换为 F/T 而不是 FALSE/TRUE.
- 如果一个字符字段只包括数值且值中包括前导的零, Excel 转换它为数值型的值 (如 "00000100" => 100).
- 日期型字段导出时要将设为 mm/dd/yy 格式或 mm/dd/yyyy 格式,否则导回时将丢失日期字段内容.
特别是字段是一个专用关键字且你又要在稍后从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超长的数据
---------------------------------------------------------------

方法六:

如何复制多于 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
booksoon 2009-10-22
  • 打赏
  • 举报
回复
按行读取,写入excel
WWWWA 2009-10-22
  • 打赏
  • 举报
回复
有多种方式:
1、直接COPY TO;
2、用EXCEL VBA的COPYFROMRECORDSET;
3、导出为TXT,再导入EXCEL中;
4、用_vfp.DataToClip、_CLIPTEXT导入。
chinawcs 2009-10-22
  • 打赏
  • 举报
回复
那我现在 用的 vfp6.0 开发的 vfp9.0编译会报错
如何在vfp6.0 下 导出 xls 支持65536 行
加载更多回复(1)

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧