找回密码
 加入
搜索
查看: 5328|回复: 9

[效率算法] _ExcelWriteSheetFromArray 函数写入太慢啊!有好办法吗?

  [复制链接]
发表于 2010-11-28 11:35:49 | 显示全部楼层 |阅读模式
_ExcelWriteSheetFromArray 函数写入的数据有5万行,需要1个多小时,不能忍受啊!
各位老大有效率高些的方法吗?
发表于 2010-11-28 11:47:06 | 显示全部楼层
呵,用这个函数的确很慢,你可以先把要写的数据都组织好,然后放入剪贴板,只要粘贴一下就搞定了。才五万行,绝对不会超过5分钟
 楼主| 发表于 2010-11-28 12:09:52 | 显示全部楼层
是个思路。可靠性如何呢?
发表于 2010-11-28 12:18:12 | 显示全部楼层
我就是这么处理的。除非你写的程序有问题,程序都是按照你的代码执行的,你不出错就绝对不会有问题
发表于 2010-11-28 12:36:58 | 显示全部楼层
为什么不直接用EXCEL 非要用AUTO IT呢
发表于 2010-11-29 22:47:30 | 显示全部楼层
先   $oExcel.Visible = false
_ExcelWriteSheetFromArray。。。。。
再   $oExcel.Visible = true
 楼主| 发表于 2010-11-30 14:44:22 | 显示全部楼层
先   $oExcel.Visible = false
_ExcelWriteSheetFromArray。。。。。
再   $oExcel.Visible = true
h20040606 发表于 2010-11-29 22:47


$oExcel.Visible = false
$oExcel.ScreenUpdating =False
_ExcelWriteSheetFromArray。。。。。   
$oExcel.ScreenUpdating =True
$oExcel.Visible = true

这样效率是否更高些啊!
 楼主| 发表于 2010-11-30 14:46:26 | 显示全部楼层
为什么不直接用EXCEL 非要用AUTO IT呢
oceanwind 发表于 2010-11-28 12:36



需要用到autoit的一些特性,比如正则等
 楼主| 发表于 2010-11-30 15:05:37 | 显示全部楼层
以下是楼主的部分代码。最终优化方案是“方法三”。数据量60000条(20列),数据写入从1个多小时,减少到15秒以内。抛砖引玉,希望各位老大提出更好的方案。

方法1
;;;;效率1,时间60分钟以上,数据量:60000条数据;;;
_ExcelWriteSheetFromArray($oExcel_temp, $new_array, 1, 1, 1, 0);;;;数据写入excel表

方法二:
;;;;效率30,时间30秒,数据量:60000条数据.限制:655536条数据,因为transpose()函数:excel2007不知有无限制?
$oExcel_temp.activesheet.range("A1").resize(UBound($new_array),20)=$oExcel_temp.transpose($new_array)


方法三:
;;;;效率90,时间12秒,数据量:60000条数据
;;;改写了_ArrayToString函数,使之(仅)支持二维数组
ClipPut('');;;;清空剪贴板:预备动作
_ArrayToClip2D($new_array, 0,1);;;把数组写入剪贴板(开始行0,开始列1):仅支持二维数组。原数组仅支持一维数组
$text = ClipGet();;;;获取剪贴板文本数据

$oExcel_temp.activesheet.range("A1" ).Select;;;选择A1单元格:下句将从A1单元格开始复制
$oExcel_temp.activesheet.range("A1" ).PasteSpecial;;;复制剪贴板文本数据

Func _ArrayToString2D(Const ByRef $avArray, $sDelim = @CR, $iStart_row = 0, $iStart_column = 0)
;~         $avArray;;数组
;~         $sDelim = "@CR";;分隔符号:回车
;~         $iStart_row_row = 0;;数组开始行
;~         $iStart_column = 0;;;数组开始列
        If Not IsArray($avArray) Then Return SetError(1, 0, "")
        If UBound($avArray, 0) <> 2 Then Return SetError(3, 0, "");;;;;必须为二维数组

        Local $sResult, $iUBound1 = UBound($avArray, 1), $iUBound2 = UBound($avArray, 2)

        ; Bounds checking
;~         If $iStart_column < 0 Or $iStart_column > $iUBound2 Then $iStart_column = $iUBound2
;~         If $iStart_row < 0 Or $iStart_row > $iUBound1 Then $iStart_row = $iUBound1


        ; Combine
        For $i = $iStart_row To $iUBound1 - 1
                For $x = $iStart_column To $iUBound2 - 1 - 1
                        $sResult &= $avArray[$i][$x] & @TAB;;;;连接字符串,使用TAB符号:到倒数第2个为止
                Next
                $sResult &= $avArray[$i][$iUBound2 - 1] & $sDelim;;;;连接最后一个数据,并附加回车
        Next
        Return StringTrimRight($sResult, StringLen($sDelim))
EndFunc   ;==>_ArrayToString2D


Func _ArrayToClip2D(Const ByRef $avArray, $iStart_row = 0, $iStart_column = 0)
        Local $sResult = _ArrayToString2D($avArray, @CR, $iStart_row = 0, $iStart_column = 0)
        If @error Then Return SetError(@error, 0, 0)
        Return ClipPut($sResult)
EndFunc   ;==>_ArrayToClip2D
发表于 2010-11-30 19:15:20 | 显示全部楼层
需要用到autoit的一些特性,比如正则等
ghl781258 发表于 2010-11-30 14:46

不知道 反正EXCEL可作好多事情 或许你传个源数据格式与
目标格式 或许有EXCEL高手可作
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 21:30 , Processed in 0.083559 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表