找回密码
 加入
搜索
查看: 3898|回复: 4

[效率算法] 请教一个将结果内容回写到excel中的效率算法

  [复制链接]
发表于 2012-11-27 06:54:06 | 显示全部楼层 |阅读模式
一个excel文件,有N行14列,请查看附件中的excel
一个INI文件,请查看附件中的INI
现在的目的是想把INI中的结果导入到excel的第3列中,为了保证不蹿行。所以就想先比对下ini的和excel第一列的内容是否一样,如果一样才将结果写入excel
以下是我的代码,效率太差了。内容少的时候还不觉得,内容上W以后比蜗牛还慢。请大家帮忙看能不能优化一下,谢谢了
#include <Excel.au3>
#include <File.au3>
#include <ie.au3>
#include <array.au3>
#include <winapi.au3>
#include <_Ini.au3>

_initoexcel()



Func _initoexcel()
        $weizzz = _IniReadSection('结果.ini', '结果')
        _arraydisplay ($weizzz)
        $oExcel = _ExcelBookOpen(@ScriptDir & '\test.xlsx', 1)
        If Not @error Then
                $oExcelline = $oExcel.activesheet.usedrange.rows.count
                $arr1 = $oExcel.activesheet.range("a1").resize($oExcelline, 14).value ;
                $arr2 = $arr1
                $ddf = 1
                For $xc = 1 To $weizzz[0][0]
                        For $i = 0 To $oExcelline - $ddf
                                
                                If $weizzz[$xc][0] = $arr1[0][$i] Then
                                        $arr2[2][$i] = $weizzz[$xc][1]
                                        ExitLoop
                                EndIf
                        Next
                Next
                $oExcel.activesheet.range("a1").resize($oExcelline, 14).value = $arr2
        EndIf
        _ExcelBookClose($oExcel, 1, 0) ;在没有任何提示的情况下保存并关闭工作表, 可选参数:0 = 不提示(默认值), 1 = 提示
        ProcessClose('Excel.exe')
EndFunc   ;==>_initoexcel




附件中包含所需的文件,请下载查看详情

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-27 07:47:56 | 显示全部楼层
本帖最后由 netegg 于 2012-11-27 07:49 编辑

#Include <Excel.au3>
_ExcelWriteSheetFromArray
ini读出二维数组直接填,保证对应的上,然后再插入一列就完了
发表于 2012-11-27 08:59:25 | 显示全部楼层
Func _initoexcel()
        $weizzz = _IniReadSection('结果.ini', '结果')
        $dic=ObjCreate("scripting.dictionary")
        For $n=1 To $weizzz[0][0]
                $dic($weizzz[$n][0])=$weizzz[$n][1]
        Next
        $excel=ObjCreate("excel.application")
        $excel.visible=False
        $wb=$excel.workbooks.open(@ScriptDir&"\test.xlsx")
        With $wb.activesheet
                $arr=.range("a1",.cells.specialcells(11)).value
                For $n=1 To UBound($arr,2)-1
                        If $dic.exists($arr[0][$n]) Then $arr[2][$n]=$dic($arr[0][$n])
                Next
                .range("a1").resize(UBound($arr,2),UBound($arr)).value=$arr
        EndWith
        $wb.close(true)
        $excel.quit
        $dic=0
        $wb=0
        $excel=0
EndFunc
换成这个试下
发表于 2012-11-28 08:34:21 | 显示全部楼层
本帖最后由 blue_dvd 于 2012-11-28 08:35 编辑

回复 3# kevinch
$dic($weizzz[$n][0])=$weizzz[$n][1]
这句是什么意思?
.cells.specialcells(11)
这个又是什么意思?给个解释吧!谢谢
发表于 2012-11-28 09:44:36 | 显示全部楼层
本帖最后由 kevinch 于 2012-11-28 09:46 编辑
$dic($weizzz[$n][0])=$weizzz[$n][1]  ;以$weizzz[$n][0]为key值,$weizzz[$n][1]为item项内容,将一一对应关系存入字典中,字典是利用hash原理,可以快速根据key值取得对应的item值
.cells.specialcells(11)  ;工作表中最后一个单元格的表示方式,11在vba中对应此函数的常量名是xlCellTypeLastCell
总体而言就是先将ini中的内容一一对应的放入字典中,因为字典可以根据key值快速提取item值内容,所以将单元格区域读入数组后,快速提取内容修改数组对应内容,然后写回工作表,虽然读取ini的速度不能算慢,但实测字典还是比直接读取ini快超多倍
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 14:28 , Processed in 0.071957 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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