xudaweb 发表于 2015-1-6 10:39:24

AU3对Excel的操作

刚学AutoIT,有个疑问请教大家:

想实现从第9行第7列开始,读取下面整列数据,下面这个代码能实现。
$aArray = _ExcelReadSheetToArray($oExcel, 9, 7, 0, 1) ;从第9行第7列开始,读取这一列
_ArrayDisplay($aArray, "读取1列")
如果我想把单元格中原本是类似与"C1-C3,C5-C6,C12"这样的数据替换成"C1,C2,C3,C5,C6,C12",如何实现呢?

netegg 发表于 2015-1-6 11:06:55

看不懂。。。。。

xudaweb 发表于 2015-1-6 11:27:18

回复 2# netegg

额,是我表述的不清楚吧。

我想把excel里面(从第9行第7列开始,往下的整列数据),如果遇到单元格的数据是“A1-A3,C2-C6”这样的就拆分开,结果是“A1,A2,A3,C2,C3,C4,C5,C6”,如果数据中没有'-'这样的就保持原样。

netegg 发表于 2015-1-6 11:42:45

#Include <Excel.au3>
#Include <Array.au3>
$aArray = _ExcelReadSheetToArray($oExcel, 9, 7)
$iIndex =_ArraySearch($aArray, 'A1-A3,C2-C6', 0, 0, 0, 1, $sColumn)
_ExcelWriteCell($oExcel, 'A1,A2,A3,C2,C3,C4,C5,C6', $iIndex,$sColumn)

xudaweb 发表于 2015-1-6 13:55:20

回复 4# netegg

netegg, 感谢热心帮助,但是:
单元格里不只是‘A1-A3,C2-C6’,许多都是字母打头数字结尾的这种,需要用什么规律拆开呢?

netegg 发表于 2015-1-6 14:12:38

回复 5# xudaweb
那就看到底是什么形式了,这个不是这里讨论的问题,根据不同的格式,传递不同的格式过去就行了

xudaweb 发表于 2015-1-6 14:24:48

回复 6# netegg

现在棘手的是,没有规律,而且还很多,我总结的规律是:字母(单个、多个)+数字 (数字递增)!
例如: R1-R5,DS1-DS10,PU3-PU7

请问这个需要从哪个方向入手啊?谢谢~

netegg 发表于 2015-1-6 15:03:52

本帖最后由 netegg 于 2015-1-6 15:06 编辑

先拆成数组,然后对每个数组元素正则获取数字范围,并获取字符,和数字组合输出

netegg 发表于 2015-1-6 15:36:29

#include<string.au3>
#include<array.au3>
Local $str = 'R1-R5,DS1-DS10,PU3-PU7'
$aStr = StringSplit($str, ',', 2)
For $t = 0 To UBound($aStr) - 1
        $b = StringRegExp($aStr[$t], '\D+', 3)
        $a = StringRegExp($aStr[$t], '\d+', 3)
        For $i = 0 To UBound($b) - 1 Step 2
                ConsoleWrite($b[$i] & @CRLF)
        Next
        For $i = 0 To UBound($a) - 1
                ConsoleWrite($a[$i] & @CRLF)
        Next
       
Next
剩下的自己去想

netegg 发表于 2015-1-6 16:37:38

本帖最后由 netegg 于 2015-1-6 16:49 编辑

#include<string.au3>
#include<array.au3>
msgbox (0,0,replace('R1-R5,DS1-DS10,PU3-PU7'))
Func replace($str)
Local $ret
$aStr = StringSplit($str, ',', 2)
For $t = 0 To UBound($aStr) - 1
        $b = StringRegExp($aStr[$t], '\D+', 3)
        $a = StringRegExp($aStr[$t], '\d+', 3)
        For $i = 0 To UBound($b) - 1 Step 2
                For $j = 0 To UBound($a) - 1 Step 2
                        For $k = Number($a[$j]) To Number($a[$j + 1])
                                $ret &= $b[$i] & $k & ','
                        Next
                Next
        Next
Next
return StringTrimRight($ret, 1)
endfunc
用StringTrimRight($ret, 1)替换原数据

netegg 发表于 2015-1-6 19:33:20

稍等,还有点问题,C1-C3,C5-C6,C12这类的换不出来(最后一项是单个元素)

netegg 发表于 2015-1-6 19:43:38

本帖最后由 netegg 于 2015-1-6 19:49 编辑

#include<string.au3>
#include<array.au3>
MsgBox(0, 0, replace('C1-C3,C5-C6,C12'))
Func replace($str)
        Local $ret
        $aStr = StringSplit($str, ',', 2)
        For $t = 0 To UBound($aStr) - 1
                $b = StringRegExp($aStr[$t], '\D+', 3)
                $a = StringRegExp($aStr[$t], '\d+', 3)
                For $i = 0 To UBound($b) - 1 Step 2
                        For $j = 0 To UBound($a) - 1 Step 2
                                If UBound($a) = 1 Then
                                  $ret &= $b[$i] & $a[$j] & ','
                                Else
                                  For $k = Number($a[$j]) To Number($a[$j + 1])
                                        $ret &= $b[$i] & $k & ','
                                  Next
                                EndIf
                        Next
                Next
        Next
        Return StringTrimRight($ret, 1)
EndFunc   ;==>replace
行了

aiwen0092 发表于 2015-1-6 21:02:12

我轻轻的来了

xudaweb 发表于 2015-1-8 15:30:33

回复 12# netegg


    正则表达式真心看不懂啊,先谢谢热心解答了,剩下的我再摸索摸索。

sh1536 发表于 2015-1-11 18:55:00

回复 12# netegg


    蛋蛋好热心
页: [1] 2
查看完整版本: AU3对Excel的操作