|
楼主 |
发表于 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 |
|