| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2765 人关注过本帖
标题:如何从数组向EXCEL添加数据?
只看楼主 加入收藏
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
以下是引用wengjl在2021-3-26 15:39:18的发言:

你的另一种想法
不需要生成BB.XLS。只要打开模板,然后将AA.DBF中的数据一个一个写入即可。最后将模板表另存为…

试了一下,从数组中一个个读入,可以读取备注内容,但速度慢很多。字符串后面的空格还是存在。能不能不一条条,而是批量读取?

[此贴子已经被作者于2021-3-27 16:48编辑过]

2021-03-27 16:39
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
从数组读取的方案放弃了,还是采用sdta的代码。0丢失的问题,通过在模板中相应列设为文本,解决了。
现在最大的问题是字符串后面的空格如何解决?初步想法是将_cliptext的内容导出到文本,然后替换空格,再重新放回剪贴板,然后粘贴。但代码没搞定
再次求助!
2021-03-28 00:24
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
空格替换解决了。文本格式现在是在模板中设定的,不知为何在程序中设定不起作用?
WITH oExcel
    .WorkBooks.Open("&lj\表头模板.xlsx")
    .ActiveSheet.column(1).NumberFormatLocal="0000"  &&这句没起作用
    .ActiveSheet.Cells(3,1).PasteSpecial
    .ActiveSheet.cells.replace(" ","")
endwith
2021-03-28 10:58
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
首先在模板中设置自动列宽、行高
程序代码:
CLOSE DATABASES ALL 
SELECT * FROM a INTO CURSOR cx READWRITE 
* 修改字符型字段的宽度
FOR lnj = 1 TO FCOUNT()
    lc1 = FIELD(lnj)
    IF TYPE(lc1) == "C"
        CALCULATE MAX(LEN(ALLTRIM(&lc1))) TO ARRAY arr
        ALTER table cx alter &lc1 c(arr[1])
    ENDIF
ENDFOR

ERASE 查询结果.XLSX
_VFP.DataToClip("cx", RECCOUNT(), 3)
oExcel = CreateObject("Excel.Application")
WITH oExcel
    .WorkBooks.Open(SYS(5) + SYS(2003) + "\表头模板.xlsx")
    .ActiveSheet.Cells(3, 1).PasteSpecial
    .ActiveSheet.Rows[3].Delete
    SELECT cx
    SCAN 
        .ActiveSheet.Cells(2 + RECNO(), FCOUNT() - 1). Value = bz
        .ActiveSheet.Cells(2 + RECNO(), FCOUNT()). Value = ckxx
    ENDSCAN
    .DisplayAlerts = .F.
    .ActiveWorkbook.Saveas(SYS(5) + SYS(2003) + "\查询结果.XLSX", 51)
    .ActiveWorkbook.Close
    .DisplayAlerts = .T.
ENDWITH
IF FILE("查询结果.XLSX")
    MESSAGEBOX("EXCEL文件生成成功")
ENDIF 

坚守VFP最后的阵地
2021-03-28 11:19
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
谢谢sdta,你终于出现了
测试结果汇报如下:
从18000多条记录中,筛选出符合条件的6750多条记录,然后对ECCEL表进行整理,到最后完成,总耗时1分10秒,其中执行上述
oExcel = CreateObject("Excel.Application")
......
ENDWITH
之间的代码,耗时1分07秒。
可见,对DBF表本身进行操作是很快的,但VFP控制EXCEL操作非常耗时。
执行_VFP.DataToClip("cx", RECCOUNT(), 3)的时候,如果能把备注内容一起剪切,那速度将有极大提升。
我相信,您肯定能想出解决办法并教我谢谢谢谢!!!
2021-03-28 12:01
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 

发上数据测试下

坚守VFP最后的阵地
2021-03-28 12:06
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
好的
附件.rar (471.13 KB)


[此贴子已经被作者于2021-3-28 12:38编辑过]

2021-03-28 12:32
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
回复 17楼 zhousr
将就用吧
程序代码:
CLOSE DATABASES ALL 
t1 = SECONDS()
SELECT * FROM a INTO CURSOR cx READWRITE 
* 修改字符型字段的宽度
FOR lnj = 1 TO FCOUNT()
    lc1 = FIELD(lnj)
    IF TYPE(lc1) == "C"
        CALCULATE MAX(LEN(ALLTRIM(&lc1))) TO ARRAY arr
        ALTER table cx alter &lc1 c(arr[1])
    ENDIF
ENDFOR
* 把BZ、CKXX 备注字段的内容保存在字符串中
lc1 = ""
SCAN 
    lc1 = lc1 + ALLTRIM(bz) + CHR(9) + ALLTRIM(ckxx) + CHR(13) + CHR(10)
ENDSCAN
ERASE 查询结果.XLSX
GO TOP 
_VFP.DataToClip("cx", RECCOUNT(), 3)
oExcel = CreateObject("Excel.Application")
WITH oExcel
    .WorkBooks.Open(SYS(5) + SYS(2003) + "\表头模板.xlsx")
    .ActiveSheet.Cells(3, 1).PasteSpecial
    _CLIPTEXT = lc1
    .ActiveSheet.Cells(4, FCOUNT() - 1).PasteSpecial
    _CLIPTEXT = ""
    .ActiveSheet.Rows[3].Delete
    .DisplayAlerts = .F.
    .ActiveWorkbook.Saveas(SYS(5) + SYS(2003) + "\查询结果.XLSX", 51)
    .ActiveWorkbook.Close
    .DisplayAlerts = .T.
ENDWITH
MESSAGEBOX(SECONDS() - t1)
IF FILE("查询结果.XLSX")
    MESSAGEBOX("EXCEL文件生成成功")
ENDIF 

坚守VFP最后的阵地
2021-03-28 12:58
zhousr
Rank: 2
等 级:论坛游民
威 望:1
帖 子:260
专家分:47
注 册:2019-3-8
收藏
得分:0 
sdta,哪是将就着用啊!同样的数据量,现在耗时不到8秒!!!

不仅专业,而且热心,感谢感谢!!!
2021-03-28 13:27
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
试试下面的代码
程序代码:
CLOSE DATABASES 
ERASE cx.txt
ERASE 查询结果.XLSX
t1 = SECONDS()
USE a IN 0
* 生成字段列表
lcStr = ""
FOR lnj = 1 TO FCOUNT() - 2
    lcStr = lcStr + "," + FIELD(lnj)
ENDFOR
lcStr = SUBSTR(lcStr, 2)
USE IN a
SELECT * FROM a INTO CURSOR cx READWRITE 
* 修改字符型字段的宽度
FOR lnj = 1 TO FCOUNT()
    lc1 = FIELD(lnj)
    IF TYPE(lc1) == "C"
        CALCULATE MAX(LEN(ALLTRIM(&lc1))) TO ARRAY arr
        ALTER table cx alter &lc1 c(arr[1])
    ENDIF
ENDFOR
COPY TO cx.txt FIELDS &lcStr DELIMITED WITH "" WITH CHARACTER TAB ALL 
* 把BZ、CKXX 备注字段的内容保存在字符串中
lc1 = ""
SCAN 
    lc1 = lc1 + ALLTRIM(bz) + CHR(9) + ALLTRIM(ckxx) + CHR(13) + CHR(10)
ENDSCAN 

oExcel = CreateObject("Excel.Application")
WITH oExcel
    .WorkBooks.Open(SYS(5) + SYS(2003) + "\表头模板.xlsx")
    _CLIPTEXT = FILETOSTR("cx.txt")
    .ActiveSheet.Cells(3, 1).PasteSpecial
    _CLIPTEXT = lc1
    .ActiveSheet.Cells(3, FCOUNT() - 1).PasteSpecial
    _CLIPTEXT = ""
    .DisplayAlerts = .F.
    .ActiveWorkbook.Saveas(SYS(5) + SYS(2003) + "\查询结果.XLSX", 51)
    .ActiveWorkbook.Close
    .DisplayAlerts = .T.
ENDWITH
MESSAGEBOX(SECONDS() - t1)
IF FILE("查询结果.XLSX")
    MESSAGEBOX("EXCEL文件生成成功")
ENDIF 

坚守VFP最后的阵地
2021-03-28 13:50
快速回复:如何从数组向EXCEL添加数据?
数据加载中...
 
   



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

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