当前位置: 代码迷 >> VFP >> vfp6使用copy to 无法导出memo字段解决办法
  详细解决方案

vfp6使用copy to 无法导出memo字段解决办法

热度:7603   发布时间:2013-02-26 00:00:00.0
vfp6使用copy to 无法导出memo字段
大家好.

我要将带有memo字段的表导出到excel中,但发现导出后的文件内容少了memo字段,要如何才能将memo字段一起导出呢?

------解决方案--------------------------------------------------------
用代码导

&& 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类型字段。
------解决方案--------------------------------------------------------
copy file abc.dbf to def.dbf
copy file abc.fpt to def.fpt
copy file abc.cdx to def.cdx

------解决方案--------------------------------------------------------
WWWWB,我是想用程序控制.
我说的就是用代码实现,具体参考 VFP中调用ADO、JET SQL的帮助
  相关解决方案