骗子 发表于 2012-11-27 06:54:06

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

一个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
                        For $i = 0 To $oExcelline - $ddf
                               
                                If $weizzz[$xc] = $arr1[$i] Then
                                        $arr2[$i] = $weizzz[$xc]
                                        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



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

netegg 发表于 2012-11-27 07:47:56

本帖最后由 netegg 于 2012-11-27 07:49 编辑

#Include <Excel.au3>
_ExcelWriteSheetFromArray
ini读出二维数组直接填,保证对应的上,然后再插入一列就完了

kevinch 发表于 2012-11-27 08:59:25

Func _initoexcel()
        $weizzz = _IniReadSection('结果.ini', '结果')
        $dic=ObjCreate("scripting.dictionary")
        For $n=1 To $weizzz
                $dic($weizzz[$n])=$weizzz[$n]
        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[$n]) Then $arr[$n]=$dic($arr[$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换成这个试下

blue_dvd 发表于 2012-11-28 08:34:21

本帖最后由 blue_dvd 于 2012-11-28 08:35 编辑

回复 3# kevinch $dic($weizzz[$n])=$weizzz[$n]这句是什么意思?.cells.specialcells(11)这个又是什么意思?给个解释吧!谢谢

kevinch 发表于 2012-11-28 09:44:36

本帖最后由 kevinch 于 2012-11-28 09:46 编辑

$dic($weizzz[$n])=$weizzz[$n];以$weizzz[$n]为key值,$weizzz[$n]为item项内容,将一一对应关系存入字典中,字典是利用hash原理,可以快速根据key值取得对应的item值
.cells.specialcells(11);工作表中最后一个单元格的表示方式,11在vba中对应此函数的常量名是xlCellTypeLastCell总体而言就是先将ini中的内容一一对应的放入字典中,因为字典可以根据key值快速提取item值内容,所以将单元格区域读入数组后,快速提取内容修改数组对应内容,然后写回工作表,虽然读取ini的速度不能算慢,但实测字典还是比直接读取ini快超多倍
页: [1]
查看完整版本: 请教一个将结果内容回写到excel中的效率算法