| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7411 人关注过本帖, 1 人收藏
标题:发现1次EVALUATE()无法代替宏的,DBF转EXCEL
只看楼主 加入收藏
取消关键字高亮
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
可以不用EXECSCRIPT,如:
oExcel.Selection.NumberFormatLocal = lcFormat
oExcel.Range(oExcel.Cells(lnStartRows,lnStartCols),oExcel.Cells(lnEndRows,lnEndCols)).Select
2018-03-23 11:51
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
是的,在以前的基础上修改的,以前是字符,所以要拼接...
今天在公式,运行19楼代码,竟然用了 53秒...( 酷睿双核2.4,4G,WIN7 32系统)
又发现1个现象:
1.把设置格式大代码放在粘贴数据代码前面时,有设置格式的时候,运行速度比没设置格式的运行速度要.有设置时,45秒,没设置时,51秒
2.把设置格式大代码放在粘贴数据代码后面时,有设置格式的时候,运行速度比没设置格式的运行速度要.有设置时,57秒,没设置时,51秒


[此贴子已经被作者于2018-3-23 14:01编辑过]

2018-03-23 12:41
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
** 再次优化后
** CPU: I5 3470 ,WIN7 64系统,8G内存
** 设置格式时,20W条记录,用时 17秒,不设置格式时,用时16秒

** CPU: 酷睿双核 2.4 ,WIN7 32系统,4G内存
** 设置格式时,20W条记录,用时 45 秒,不设置格式时,用时51秒


CREATE CURSOR 测试表(入库单号 C(7),入库日期 D,物料名称 C(20),数量 I,单价 N(6,2),单位 C(8),规格 C(40),付款 L,日期时间 T)
 FOR i=1 To 200001
     INSERT INTO 测试表(入库单号,入库日期,物料名称,数量,单价,单位,规格,付款,日期时间) VALUES ('C'+PADL(i,6,'0'),{^2018-03-01}+INT(RAND()*10),'物料'+PADL(i,3,'0'),INT(RAND()*1000),INT(RAND()*100)*1.00,'个','',IIF(i%2=0,.t.,.f.),DATETIME())
 ENDFOR
 GO RECCOUNT() - 1
 REPLACE 入库日期 WITH {},单价 WITH 9.01 && 修改倒数2记录的日期为空,单价为小数

s1=SECONDS()
 SELECT 测试表
GO 1

 ** 下面4个参数,可以作为函数参数,在VFP9.0测试通过,10W调记录大概20秒
lnReccRows = RECCOUNT()  && 总记录数
lnPageSize = 20000      && 每页记录  
lnPageRows = 2           && 行标题行位置
lnPageCols = 2           && 第1列的位置
lnFormat = 1             && 是否根据字段设置格式

SET MARK TO "-"

PRIVATE oExcel,lnPageCount,lnWorkCount,lnPage,lnSheet,lnRows,lnFieldCount,lnStartRows,lnEndRows,lnStartCols,lnEndCols
 PRIVATE lnCols,lcSelect,lcRange,lcFormat,lcFormatNumber &&设置格式变量

lnFieldCount = AFIELDS(AryField)             && 字段数量和字段内容
lnPageCount = CEILING(lnReccRows/lnPageSize) && 计算需要总页数
lnStartRows = lnPageRows                     && 初始化单元格"开始行数"
lnStartCols = lnPageCols                     && 初始化单元格"开始列数"
lnEndRows = lnPageSize + lnPageRows          && 初始化单元格"结束行数"
lnEndCols = lnFieldCount + lnPageCols        && 初始化单元格"结束列数"

oExcel=Createobject('excel.application') && 创建电子表格
oExcel.DisplayAlerts = .F.               && 关闭 Excle 提示对话框
oExcel.Visible=.f.                       && 使电子表格可见 .t.
 oExcel.WorkBooks.Add                     && 创建工作簿
oExcel.ActiveWindow.WindowState = 2      && 最大化工作部
oExcel.Caption='数据导出'                && Excel标题


** -----------------------------------------------------------------------------------------------------------
** 工作表不够,增加工作表
lnWorkCount = oExcel.Worksheets.Count
 IF lnPageCount > lnWorkCount
    FOR lnPage = lnWorkCount + 1 To lnPageCount Step 1
        oExcel.Sheets.Add
    ENDFOR
 ENDIF

 ** -----------------------------------------------------------------------------------------------------------
 ** 设置工作表名称
For lnPage = 1 To lnPageCount STEP 1
     oExcel.sheets(lnPage).Name = '第' + ALLTRIM(STR(lnPage)) + '页'
Endfor

 ** -----------------------------------------------------------------------------------------------------------
 ** 利用剪贴板把DBF内容复制到EXCEL表
FOR lnSheet = 1 TO lnPageCount STEP 1 && 分别打开各个工作表
    oExcel.sheets(lnSheet).Activate
     lnRows = (lnSheet-1) * lnPageSize + 1 && 当前页数的第1个记录号
    lnPageMaxSize = IIF(lnPageSize * lnSheet > lnReccRows ,lnReccRows + lnPageSize - lnPageSize * lnSheet,lnPageSize) && 计算最后不满1页的记录数
    lnEndRows = lnPageMaxSize + lnPageRows

 ** -----------------------------------------------------------------------------------------------------------
     ** 设置格式
    IF lnFormat>0 && 等于0时,不进行格式设置
       FOR i=1 TO lnFieldCount
            lnCols = lnPageCols + i - 1
            ** 设置格式,选择区域
            oExcel.Range(oExcel.Cells( lnPageRows + 1 ,lnCols ),oExcel.Cells( lnEndRows ,lnCols )).Select

            DO CASE
               CASE INLIST(AryField(i,2),"C","V")     && 文本格式
                   lcFormat = "@"
               CASE AryField(i,2)="I"                 && 整数格式
                   lcFormat = "0_ "
               CASE INLIST(AryField(i,2),"B","N","F") && 小数格式
                   lcFormat = IIF(AryField(i,4) = 0,"0_ ","0."+REPLICATE("0",AryField(i,4))+"_ ")
               CASE AryField(i,2)="D"                 && 日期格式
                   lcFormat = "yyyy-m-d"
               CASE AryField(i,2)="T"                 && 日期时间格式
                   lcFormat = "yyyy-m-d hh:mm:ss"
               OTHERWISE                              && 其他通用格式
                   lcFormat = "G/通用格式"
            ENDCASE
            
            oExcel.Selection.NumberFormatLocal = lcFormat
     ENDFOR
     ENDIF

 ** -----------------------------------------------------------------------------------------------------------   
     ** 从当前位置开始,复制一页的记录作为文本复制到剪贴板上,3使用制表符分隔字段
    GO lnRows
     _vfp.DataToClip(ALIAS(),lnPageMaxSize,3)
     ** 选择区域,粘贴数据
     oExcel.Range(oExcel.Cells(lnStartRows , lnStartCols) ,oExcel.Cells(lnEndRows , lnEndCols)).Select
     oExcel.ActiveSheet.Paste && 粘贴数据
     oExcel.Columns.AutoFit   && 单元格宽度自动调整
     
 ENDFOR

 MESSAGEBOX(TRANSFORM(SECONDS()-S1))
 oExcel.Visible=.T.

 *!* oExcelApp.ActiveWorkbook.SaveAs(cExcelFile)       && 另存为
*!* oExcel.ActiveWorkbook.Save                        && 自动列宽
*!* oExcel.Workbooks.Close                            && 关闭表
*!* oExcel.Quit                                       && 退出Excel
 *!* Release oExcel  &&关闭进程
2018-03-23 13:52
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
也来练练手
**
** DBF转EXCEL
**
CREATE CURSOR 测试表(编号 C(10), 入库单号 C(7), 入库日期 D, 物料名称 C(20), 数量 I,;
    单价 N(14,2), 单位 C(8), 规格 C(30), 付款 L, 日期时间 T, 备注 M)
FOR i=1 To 100
    INSERT INTO 测试表 VALUES (PADL(i,10,"0"), 'C'+PADL(i,6,'0'), {^2018-03-01}+INT(RAND()*10),;
         '物料'+PADL(i,3,'0'), INT(RAND()*1000), INT(RAND()*100)*1.00, '个', '',;
         IIF(i%2=0,.t.,.f.), DATETIME(), "备注_"+TRANSFORM(i))
ENDFOR
AFIELDS(aFieldInfo)
FOR i=1 TO ALEN(aFieldInfo,1)
    aFieldInfo[i,7] = aFieldInfo[i,1]    && 可自定义,用作栏目名
    aFieldInfo[i,8] = ICASE(;            && 数据格式
        aFieldInfo[i,2]=="I", '##0;[=0]""',;              && 整数格式
        INLIST(aFieldInfo[i,2],"B","N","F"), '#,##0.'+REPLICATE("0",aFieldInfo[i,4])+';[=0]""',; && 小数格式
        INLIST(aFieldInfo[i,2],"C","V","W","M"), '@',;    && 文本格式
        aFieldInfo[i,2]=="D", 'yyyy-m-d',;                && 日期格式
        aFieldInfo[i,2]=="T", 'yyyy-m-d hh:mm:ss',;       && 日期时间格式
        'G/通用格式')   
ENDFOR
_DBF_EXCEL("C:\TEMP\test.xls", "测试表", @aFieldInfo, 20, 4, 1, "数 据 导 出 表", 2)
RETURN

**
** DBF转EXCEL
** _DBF_EXCEL(cOutFile, cAlias, aFieldInfo, nPageRows, nStartRow, nStartCol, cTitle, nTitleRow)
**     cOutFile    输出EXCEL文件名
**     cAlias      DBF表工作区别名
**     aFieldInfo  字段信息,用AFIELDS()获取,可自定义栏目名、数据格式等。
**     nPageRows   每页数据行数
**     nStartRow   开始行
**     nStartCol   开始列
**     cTitle      标题
**     nTitleRow   标题行
**
FUNCTION _DBF_EXCEL(cOutFile, cAlias, aFieldInfo, nPageRows, nStartRow, nStartCol, cTitle, nTitleRow)
    LOCAL oExcel
    oExcel = CREATEOBJECT("Excel.Application")   && 创建电子表格
    oExcel.DisplayAlerts = .F.                   && 关闭 Excle 提示对话框
    oExcel.WorkBooks.Add                         && 创建工作簿
        * 如果页数多了,删除多余的
    LOCAL nPageCount
    nPageCount = CEILING(RECCOUNT(cAlias)/nPageRows)    && 页数
    DO WHILE oExcel.Worksheets.Count > nPageCount
        oExcel.Sheets[oExcel.Worksheets.Count].Select
        oExcel.ActiveWindow.SelectedSheets.Delete
    ENDDO
        * 如果页数不够,添加
    FOR i=oExcel.Worksheets.Count+1 TO nPageCount
        oExcel.Sheets.Add
    ENDFOR
        * 页名
    FOR i=1 TO nPageCount
        oExcel.Sheets[i].Name = "第"+TRANSFORM(i)+"页"
    ENDFOR
        * 利用剪贴板把DBF内容复制到EXCEL表
    SELECT (cAlias)
    LOCAL nRow, nCol, nEndRow, nEndCol
    nEndRow = nStartRow + nPageRows                && 结束行,第1行为栏目行
    nEndCol = nStartCol + ALEN(aFieldInfo,1) - 1   && 结束列
    FOR i=1 TO nPageCount    && 处理各页
        WITH oExcel
                * 打开页
            .Sheets[i].Activate
                * 标题格式设置
            .Range(.Cells(nTitleRow,nStartCol), .Cells(nTitleRow,nEndCol)).Select
            .Selection.NumberFormatLocal = "@"        && 文本格式
            .Selection.HorizontalAlignment = -4108    && 居中 xlCenter
            .Selection.VerticalAlignment = -4108
            .Selection.Merge                          && 合并单元格  
                * 栏目行格式设置
            .Range(.Cells(nStartRow,nStartCol), .Cells(nStartRow,nEndCol)).Select
            .Selection.NumberFormatLocal = "@"
            .Selection.HorizontalAlignment = -4108    && 居中 xlCenter
            .Selection.VerticalAlignment = -4108
                * 各列数据格式设置
            FOR nCol=nStartCol TO nEndCol
                .Range(.Cells(nStartRow+1,nCol), .Cells(nEndRow,nCol)).Select
                .Selection.NumberFormatLocal = aFieldInfo[nCol-nStartCol+1, 8]
            ENDFOR
            .Cells(nTitleRow,nStartCol).Value = cTitle    && 标题
            GO (i-1)*nPageRows + 1                   && 每页第一行的数据记录位置
            _VFP.DataToClip(cAlias, nPageRows, 3)    && 复制DBF记录
            .Range(.Cells(nStartRow,nStartCol), .Cells(nEndRow,nEndCol)).Select
            .ActiveSheet.Paste                       && 粘贴到EXCEL
            FOR nCol=nStartCol TO nEndCol            && 用自定义栏目名
                .Cells(nStartRow,nCol).Value = ALLTRIM(aFieldInfo[nCol-nStartCol+1, 7])
            ENDFOR
            FOR nCol=nStartCol TO nEndCol    && 处理备注字段
                IF aFieldInfo[nCol-nStartCol+1, 2]=="M"
                    nRow = nStartRow+1
                    GO (i-1)*nPageRows + 1
                    SCAN NEXT nPageRows
                        .Cells(nRow,nCol).Value = EVALUATE(aFieldInfo[nCol-nStartCol+1, 1])
                        nRow = nRow + 1
                    ENDSCAN
                ENDIF
            ENDFOR
            .Columns.AutoFit    && 自动适应栏目宽
            .Cells(1,1).Select
        ENDWITH
    ENDFOR
    oExcel.Sheets[1].Activate                    && 打开第1页

**            * 调试观察时用
**        oExcel.ActiveWindow.WindowState = 2          && 最大化窗口
**        oExcel.Caption = cTitle                      && Excel标题
**        oExcel.Visible = .T.
**        MESSAGEBOX("中断预览")
   
        * 保存关闭
    oExcel.ActiveWorkbook.SaveAs(cOutFile, -4143)    && 另存, 常规工作簿格式,xlNormal:-4143
    oExcel.Workbooks.Close                           && 关闭工作簿
    oExcel.Quit                                      && 关闭Excel
    RELEASE oExcel                                   && 释放oExcel
ENDFUNC
2018-03-24 10:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
好,刚测试一下,10W记录, I5 3470,8G,WIN7 64,
在有备注字段时,每页1W记录,花45秒
在没备注字段时,每页1W记录,花15秒
能否在有备注字段的时候,优化。。。
2018-03-24 10:50
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 25楼 mywisdom88
备注字段存放的是一组数据,VFP的命令好象只能按每条记录来处理。
看了一下,EXCEL的文本单元(多行文本)复制粘贴的数据格式:
如单元格内容:
abc
123
ABC
复制数据格式:
列块复制:
    "abc换行符123换行符ABC"回车换行符
    每个单元的内容用双引号表示("单元"),单元内容换行用换行符(0A),不同单元用回车换行符(0D0A)区分。
行块复制:
    "abc换行符123换行符ABC"制表符
    每个单元的内容用双引号表示("单元"),单元内容换行用换行符(0A),不同单元用制表符(09)区分。
要按这种格式处理才可以整块复制粘贴,这样处理可能更费时,还要处理备注字段内容包含双引号和制表符的问题。


[此贴子已经被作者于2018-3-24 17:01编辑过]

2018-03-24 16:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用mywisdom88在2018-3-24 10:50:34的发言:

好,刚测试一下,10W记录, I5 3470,8G,WIN7 64,
在有备注字段时,每页1W记录,花45秒
在没备注字段时,每页1W记录,花15秒
能否在有备注字段的时候,优化。。。

写了个类似 VFP.DataToClip() 的_MemToClipCol函数来处理,速度好象较快。
复制数据格式:
列块复制:
     每个单元的内容用双引号表示("单元"),不同单元用回车换行符(0h0D0A)分隔。
备注字段内容包含的双引号“"”要替换成“""”

**
** DBF转EXCEL
**
CREATE CURSOR 测试表 (编号 C(10), 入库单号 C(7), 入库日期 D, 物料名称 C(20), 数量 I,;
    单价 N(14,2), 单位 C(8), 规格 C(30), 付款 L, 日期时间 T, 备注 M)
FOR i=1 To 101
    INSERT INTO 测试表 VALUES (PADL(i,10,"0"), 'C'+PADL(i,6,'0'), {^2018-03-01}+INT(RAND()*10),;
         '物料'+PADL(i,3,'0'), INT(RAND()*1000), INT(RAND()*100)*1.00, '个', '',;
         IIF(i%2=0,.t.,.f.), DATETIME(), '备注_"'+TRANSFORM(i)+'"'+0h0D0A+"_"+TRANSFORM(i)+0h0D0A)
ENDFOR
AFIELDS(aFieldInfo)
FOR i=1 TO ALEN(aFieldInfo,1)
    aFieldInfo[i,7] = aFieldInfo[i,1]    && 可自定义,用作栏目名
    aFieldInfo[i,8] = ICASE(;            && 数据格式
        aFieldInfo[i,2]=="I", '##0;[=0]""',;              && 整数格式
        INLIST(aFieldInfo[i,2],"B","N","F"), '#,##0.'+REPLICATE("0",aFieldInfo[i,4])+';[=0]""',; && 小数格式
        INLIST(aFieldInfo[i,2],"C","V","W","M"), '@',;    && 文本格式
        aFieldInfo[i,2]=="D", 'yyyy-m-d',;                && 日期格式
        aFieldInfo[i,2]=="T", 'yyyy-m-d hh:mm:ss',;       && 日期时间格式
        'G/通用格式')   
ENDFOR
t1=SECONDS()
_DBF_EXCEL("C:\TEMP\test.xls", "测试表", @aFieldInfo, 20, 4, 1, "数 据 导 出 表", 2)
? SECONDS()-t1
RETURN

**
** DBF转EXCEL
** _DBF_EXCEL(cOutFile, cAlias, aFieldInfo, nPageRows, nStartRow, nStartCol, cTitle, nTitleRow)
**     cOutFile    输出EXCEL文件名
**     cAlias      DBF表工作区别名
**     aFieldInfo  字段信息,用AFIELDS()获取,可自定义栏目名、数据格式等。
**     nPageRows   每页数据行数
**     nStartRow   开始行
**     nStartCol   开始列
**     cTitle      标题
**     nTitleRow   标题行
**
FUNCTION _DBF_EXCEL(cOutFile, cAlias, aFieldInfo, nPageRows, nStartRow, nStartCol, cTitle, nTitleRow)
    LOCAL oExcel
    oExcel = CREATEOBJECT("Excel.Application")   && 创建电子表格
    oExcel.DisplayAlerts = .F.                   && 关闭 Excle 提示对话框
    oExcel.WorkBooks.Add                         && 创建工作簿
        * 如果页数多了,删除多余的
    LOCAL nPageCount
    nPageCount = CEILING(RECCOUNT(cAlias)/nPageRows)    && 页数
    DO WHILE oExcel.Worksheets.Count > nPageCount
        oExcel.Sheets[oExcel.Worksheets.Count].Select
        oExcel.ActiveWindow.SelectedSheets.Delete
    ENDDO
        * 如果页数不够,添加
    FOR i=oExcel.Worksheets.Count+1 TO nPageCount
        oExcel.Sheets.Add
    ENDFOR
        * 页名
    FOR i=1 TO nPageCount
        oExcel.Sheets[i].Name = "第"+TRANSFORM(i)+"页"
    ENDFOR
        * 利用剪贴板把DBF内容复制到EXCEL表
    SELECT (cAlias)
    LOCAL nRow, nCol, nEndRow, nEndCol
    nEndRow = nStartRow + nPageRows                && 结束行,第1行为栏目行
    nEndCol = nStartCol + ALEN(aFieldInfo,1) - 1   && 结束列
    FOR i=1 TO nPageCount    && 处理各页
        WITH oExcel
                * 打开页
            .Sheets[i].Activate
                * 标题格式设置
            .Range(.Cells(nTitleRow,nStartCol), .Cells(nTitleRow,nEndCol)).Select
            .Selection.NumberFormatLocal = "@"        && 文本格式
            .Selection.HorizontalAlignment = -4108    && 居中 xlCenter
            .Selection.VerticalAlignment = -4108
            .Selection.Merge                          && 合并单元格  
                * 栏目行格式设置
            .Range(.Cells(nStartRow,nStartCol), .Cells(nStartRow,nEndCol)).Select
            .Selection.NumberFormatLocal = "@"
            .Selection.HorizontalAlignment = -4108    && 居中 xlCenter
            .Selection.VerticalAlignment = -4108
                * 各列数据格式设置
            FOR nCol=nStartCol TO nEndCol
                .Range(.Cells(nStartRow+1,nCol), .Cells(nEndRow,nCol)).Select
                .Selection.NumberFormatLocal = aFieldInfo[nCol-nStartCol+1, 8]
            ENDFOR
            .Cells(nTitleRow,nStartCol).Value = cTitle    && 标题
            GO (i-1)*nPageRows + 1                   && 每页第一行的数据记录位置
            _VFP.DataToClip(cAlias, nPageRows, 3)    && 复制DBF记录
            _CLIPTEXT = STRTRAN(_CLIPTEXT, '"', '"')
            .Range(.Cells(nStartRow,nStartCol), .Cells(nEndRow,nEndCol)).Select
            .ActiveSheet.Paste                       && 粘贴到EXCEL
            FOR nCol=nStartCol TO nEndCol            && 用自定义栏目名
                .Cells(nStartRow,nCol).Value = ALLTRIM(aFieldInfo[nCol-nStartCol+1, 7])
            ENDFOR
            FOR nCol=nStartCol TO nEndCol    && 处理备注字段
                IF aFieldInfo[nCol-nStartCol+1, 2]=="M"
                    GO (i-1)*nPageRows + 1
                        * 速度较快
                    _MemToClipCol(cAlias, aFieldInfo[nCol-nStartCol+1, 1], nPageRows)
                    .Range(.Cells(nStartRow+1,nCol), .Cells(nEndRow,nCol)).Select
                    .ActiveSheet.Paste        && 粘贴到EXCEL
**                            * 速度较慢
**                        nRow = nStartRow+1
**                        SCAN NEXT nPageRows
**                            .Cells(nRow,nCol).Value = EVALUATE(aFieldInfo[nCol-nStartCol+1, 1])
**                            nRow = nRow + 1
**                        ENDSCAN
                ENDIF
            ENDFOR
            .Cells(1,1).Select
            .Columns.AutoFit    && 自动适应行列宽
            .Rows.AutoFit
        ENDWITH
    ENDFOR
    oExcel.Sheets[1].Activate                    && 打开第1页

**            * 调试观察时用
**        oExcel.ActiveWindow.WindowState = 2          && 最大化窗口
**        oExcel.Caption = cTitle                      && Excel标题
**        oExcel.Visible = .T.
**        MESSAGEBOX("中断预览")
   
        * 保存关闭
    oExcel.ActiveWorkbook.SaveAs(cOutFile, -4143)    && 另存, 常规工作簿格式,xlNormal:-4143
    oExcel.Workbooks.Close                           && 关闭工作簿
    oExcel.Quit                                      && 关闭Excel
    RELEASE oExcel                                   && 释放oExcel
ENDFUNC

FUNCTION _MemToClipCol(cAlias, cFieldName, nRecord)
    LOCAL cMem
    cMem = ""
    SELECT (cAlias)
    IF !EOF()
        cMem = '"' + STRTRAN(EVALUATE(cFieldName), '"', '""') + '"'
        SKIP
        SCAN NEXT nRecord-1
            cMem = cMem + 0h0D0A + '"' + STRTRAN(EVALUATE(cFieldName), '"', '""') + '"'
        ENDSCAN
    ENDIF
    _CLIPTEXT = cMem   
ENDFUNC

[此贴子已经被作者于2018-3-24 23:31编辑过]

2018-03-24 22:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
发现了一个问题:
字符型字段的字符串第一个字符是双引号("),用_VFP.DataToClip()复制,粘贴结果可能会出现异常。
暂替换为全角双引号(")处理:
_VFP.DataToClip(cAlias, nPageRows, 3)    && 复制DBF记录
_CLIPTEXT = STRTRAN(_CLIPTEXT, '"', '"')
2018-03-24 23:24
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用吹水佬在2018-3-24 23:24:38的发言:

发现了一个问题:
字符型字段的字符串第一个字符是双引号("),用_VFP.DataToClip()复制,粘贴结果可能会出现异常。
暂替换为全角双引号(")处理:
_VFP.DataToClip(cAlias, nPageRows, 3)    && 复制DBF记录
_CLIPTEXT = STRTRAN(_CLIPTEXT, '"', '"')
真好,我测试了,2W记录,每页2000,每改善M字段时,要15秒,改善后5秒,速度快了很多。

[此贴子已经被作者于2018-3-25 00:27编辑过]

2018-03-25 00:19
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1735
专家分:3329
注 册:2012-2-29
收藏
得分:0 
@吹水佬、mywisdom88,谢谢二位!
2018-03-25 09:08
快速回复:发现1次EVALUATE()无法代替宏的,DBF转EXCEL
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023672 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved