Что нового

Считывание листа Excel в массив и поиск строк по шаблону

atmel007

Новичок
Сообщения
13
Репутация
0
Здравствуйте, подскажите как быстро считать лист Excel с более чем 100 строк и найти все строки с текущей датой и скопировать их другой файл Excel . я так понимаю быстрее всего считать лист в массив и там уже искать.

Код:
$iTrueRowsCount = $oExcel_base.Activesheet.UsedRange.Rows.Count
Local	$date =  @YEAR& @MON &@MDAY
Local	$avArray = _ExcelReadSheetToArray($oExcel_base, 2, 9, $iTrueRowsCount-1, 1)
_ArrayTrim($avArray,6,1,2,$iTrueRowsCount)
$aiResult = _ArrayFindAll($avArray, $date,1,$iTrueRowsCount-1,0,1,9)
_ArrayDisplay($aiResult, "тест")


вроде что-то находит, а что дальше непонятно.
 

Вложения

  • тест.zip
    4 КБ · Просмотры: 13

pvnn

Осваивающий
Сообщения
305
Репутация
32
Если исходный файл как в архиве, то вот

Код:
#include <Excel.au3>
#include <Array.au3>
#include <Date.au3>

; Текущая дата дд.мм.гггг
$Today=StringMid(_NowCalcDate(),9,2)&'.'&StringMid(_NowCalcDate(),6,2)&'.'&StringLeft(_NowCalcDate(),4)


$sFilePath = @ScriptDir & '\тест.xls'
$oExcel = _ExcelBookOpen($sFilePath,0)
; Считываем в Массив
 $aData = _ExcelReadSheetToArrayQuick($oExcel, 1, 1)
;_ArrayDisplay($aData)
_ExcelBookClose($oExcel)


$sFilePath2 = @ScriptDir & '\тест2.xls'
$oExcel2 = _ExcelBookNew()


$j=1
For $i=0 To UBound($aData)-1
	; Переводим дату в нормальный вид
	If StringLen($aData[$i][8])<>0 Then	$aData[$i][8]=StringMid($aData[$i][8],7,2)&'.'&StringMid($aData[$i][8],5,2)&'.'&StringLeft($aData[$i][8],4)&' '&StringMid($aData[$i][8],9,2)&':'&StringMid($aData[$i][8],11,2)&':'&StringMid($aData[$i][8],13,2)
	If StringLen($aData[$i][9])<>0 Then	$aData[$i][9]=StringMid($aData[$i][9],7,2)&'.'&StringMid($aData[$i][9],5,2)&'.'&StringLeft($aData[$i][9],4)&' '&StringMid($aData[$i][9],9,2)&':'&StringMid($aData[$i][9],11,2)&':'&StringMid($aData[$i][9],13,2)
	If $Today=StringLeft($aData[$i][8],10) Then
		_ExcelSheetWriteFromArray($oExcel2,$aData,$j,1,$i,1,$i)
		$j+=1
	EndIf
Next





Func _ExcelReadSheetToArrayQuick($oExcel, $iStartRow = 1, $iStartColumn = 1, $iRowCnt = 0, $iColCnt = 0)
    Local $avRET[1][2] = [[0, 0]] ; 2D return array
    ; Test inputs
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If $iStartRow < 1 Then Return SetError(2, 0, 0)
    If $iStartColumn < 1 Then Return SetError(2, 1, 0)
    If $iRowCnt < 0 Then Return SetError(3, 0, 0)
    If $iColCnt < 0 Then Return SetError(3, 1, 0)

    ; Get size of current sheet as R1C1 string
    ;     Note: $xlCellTypeLastCell and $x1R1C1 are constants declared in ExcelCOM_UDF.au3
    Local $sLastCell = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address(True, True, $xlR1C1)

    ; Extract integer last row and col
    $sLastCell = StringRegExp($sLastCell, "\A[^0-9]*(\d+)[^0-9]*(\d+)\Z", 3)
    Local $iLastRow = $sLastCell[0]
    Local $iLastColumn = $sLastCell[1]

    ; Return 0's if the sheet is blank
    If $sLastCell = "R1C1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET

    ; Check input range is in bounds
    If $iStartRow > $iLastRow Then Return SetError(2, 0, 0)
    If $iStartColumn > $iLastColumn Then Return SetError(2, 1, 0)
    If $iStartRow + $iRowCnt - 1 > $iLastRow Then Return SetError(3, 0, 0)
    If $iStartColumn + $iColCnt - 1 > $iLastColumn Then Return SetError(3, 1, 0)

    ; Check for defaulted counts
    If $iRowCnt = 0 Then $iRowCnt = $iLastRow - $iStartRow + 1
    If $iColCnt = 0 Then $iColCnt = $iLastColumn - $iStartColumn + 1

    ; Size the return array
    ReDim $avRET[$iRowCnt][$iColCnt]
    ;$avRET[0][0] = $iRowCnt
    ;$avRET[0][1] = $iColCnt
    $avRET = $oExcel.Application.WorksheetFunction.Transpose($oExcel.Activesheet.Cells($iStartRow, $iStartColumn).Resize($iRowCnt, $iColCnt).Value) ; здесь происходит считывание целым массивом, а не по элементно
    ;Return data
    Return $avRET
EndFunc   ;==>_ExcelReadSheetToArrayQuick

Func _ExcelSheetWriteFromArray($oExcel, ByRef $aArray, $iExcelStartRow = Default, $iExcelStartCol = Default, $iArrayStartRow = Default, $iArrayStartCol = Default, $iArrayEndRow = Default, $iArrayEndCol = Default)
    Local $iExcelEndRow = 1
    Local $iExcelEndCol = 1

    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If UBound($aArray, 0) <> 2 Then Return SetError(2, 0, 0)
    If $iExcelStartRow = Default Then $iExcelStartRow = 1
    If $iExcelStartCol = Default Then $iExcelStartCol = 1
    If $iArrayStartRow = Default Then $iArrayStartRow = 0
    If $iArrayStartCol = Default Then $iArrayStartCol = 0
    If $iArrayEndRow = Default Then $iArrayEndRow = UBound($aArray) - 1
    If $iArrayEndCol = Default Then $iArrayEndCol = UBound($aArray, 2) - 1
    If $iExcelStartRow < 1 Then $iExcelStartRow = 1
    If $iExcelStartCol < 1 Then $iExcelStartCol = 1
    If $iArrayStartRow < 0 Then $iArrayStartRow = 0
    If $iArrayStartCol < 0 Then $iArrayStartCol = 0
    If $iArrayEndRow < $iArrayStartRow Then Return SetError(3, 1, 0)
    If $iArrayEndCol < $iArrayStartCol Then Return SetError(4, 1, 0)
    $iExcelEndRow = $iExcelStartRow + $iArrayEndRow - $iArrayStartRow
    $iExcelEndCol = $iExcelStartCol + $iArrayEndCol - $iArrayStartCol

    ; Check if only part of the array is to written to the speadsheet
    If $iArrayStartRow <> 0 Or $iArrayStartCol <> 0 Or $iArrayEndRow <> UBound($aArray) - 1 Or $iArrayEndCol = UBound($aArray, 2) - 1 Then
        ;Copy specified array range to a temporary array
        Local $aTemp[$iArrayEndRow - $iArrayStartRow + 1][$iArrayEndCol - $iArrayStartCol + 1]
        Local $iRow = 0
        Local $iCol = 0
        For $i = $iArrayStartRow To $iArrayEndRow
            $iCol = 0
            For $j = $iArrayStartCol To $iArrayEndCol
                $aTemp[$iRow][$iCol] = $aArray[$i][$j]
                $iCol += 1
            Next
            $iRow += 1
        Next
        With $oExcel.ActiveSheet
            .Range(.Cells($iExcelStartRow, $iExcelStartCol), .Cells($iExcelEndRow, $iExcelEndCol)).Select
            .Range(.Cells($iExcelStartRow, $iExcelStartCol), .Cells($iExcelEndRow, $iExcelEndCol)).value = $oExcel.Application.WorksheetFunction.Transpose($aTemp)
        EndWith
    Else
        With $oExcel.ActiveSheet
            .Range(.Cells($iExcelStartRow, $iExcelStartCol), .Cells($iExcelEndRow, $iExcelEndCol)).Select
            .Range(.Cells($iExcelStartRow, $iExcelStartCol), .Cells($iExcelEndRow, $iExcelEndCol)).value = $oExcel.Application.WorksheetFunction.Transpose($aArray)
        EndWith
    EndIf
EndFunc   ;==>_ExcelSheetWriteFromArray
 
Верх