Что нового

Обработка Excel2007 не сохраненного листа >65535 строк с максимальной скоростью

Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Повысить скорость работы скрипта

Спасибо, Vovsla.
Но вот именно как метод прописать в AutoIt меня сейчас больше всего занимает. В этом, как мне кажется все проблема. И опять же, Вы используете _ExcelBookOpen. Мне нужно сохранение после вызова COM объекта..
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Повысить скорость работы скрипта

Vovsla,
Так будет значительно быстрее.
Код:
Global $sFileLine = @ScriptDir & '\Temp_1.txt', $sFileWrite = @ScriptDir & '\Temp_2.txt', $sText, _
$sFileIni = @ScriptDir & '\Temp.ini'
;=========================
;FileWriteLine
ConsoleWrite('Test FileWriteLine =============' & @LF)
$iStart = TimerInit()
For $j = 1 To 5
	$hFile = FileOpen($sFileLine, 2)
	For $i = 1 To 100000
		FileWriteLine($hFile, $i)
	Next
	FileClose($hFile)
	ConsoleWrite($j & @LF)
Next
ConsoleWrite('FileWriteLine:' & @TAB & Round(TimerDiff($iStart) / 5, 2) & ' msec' & @LF)
;==========================
;FileWrite
ConsoleWrite('Test FileWrite =============' & @LF)
$iStart = TimerInit()
For $j = 1 To 5
	For $i = 1 To 100000
		$sText &= $i & @CRLF
	Next
	$hFile = FileOpen($sFileWrite, 2)
	FileWrite($hFile, $sText)
	FileClose($hFile)
	$sText = ''
	ConsoleWrite($j & @LF)
Next
ConsoleWrite('FileWrite:' & @TAB & Round(TimerDiff($iStart) / 5, 2) & ' msec' & @LF)
;==========================
;Ini
ConsoleWrite('Test Ini =============' & @LF)
$iStart = TimerInit()
For $j = 1 To 5
	For $i = 1 To 100000
		$sText &= '[' & $i & ']' & @CRLF & $i & '=' & $i & @CRLF
	Next
	$hFile = FileOpen($sFileIni, 2)
	FileWrite($hFile, $sText)
	FileClose($hFile)
	$sText = ''
	ConsoleWrite($j & @LF)
Next
ConsoleWrite('Ini:' & @TAB & Round(TimerDiff($iStart) / 5, 2) & ' msec' & @LF)

А с SQLite так.
Код:
#include <SQLite.au3>

$iStart = TimerInit()
_SQLite_Startup()
_SQLite_Open('DBTest.db')
_SQLite_Exec(-1, 'BEGIN;')
_SQLite_Exec(-1, 'CREATE TABLE IF NOT EXISTS DBTest (Numdata, Data);')
For $i = 1 To 100000
	_SQLite_Exec(-1, 'INSERT INTO DBTest VALUES (' & $i & ', ' & $i & ');')
Next
_SQLite_Exec(-1, 'COMMIT;')
_SQLite_Close()
_SQLite_Shutdown()
ConsoleWrite('SQLite:' & @TAB & Round(TimerDiff($iStart), 2) & ' msec' & @LF)
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Повысить скорость работы скрипта

ViktorSPB
именно как метод прописать в AutoIt
На сером форуме статья интересная есть:
http://script-coding.com/MSOffice.html
Пробовал на Excel 2003, работает.
Код:
$xlCSV = 6
$xlTextMSDOS = 21
$xlWorkbookNormal = -4143
$Path = @ScriptDir&"\Test.xls"

If Not FileExists($Path) Then
    MsgBox(16, "Ошибка", $Path&" не найден.")
	Exit
EndIf

$oExcelApp = ObjCreate("Excel.Application")
$oExcelApp.DisplayAlerts = False
$oExcelApp.WorkBooks.Open (@ScriptDir&"\Test.xls")
$oExcelApp.ActiveWorkbook.SaveAs (@ScriptDir&"\Test.csv", $xlCSV)
$oExcelApp.ActiveWorkbook.SaveAs (@ScriptDir&"\Test.txt", $xlTextMSDOS)
$oExcelApp.ActiveWorkbook.SaveAs (@ScriptDir&"\CopyTest.xls", $xlWorkbookNormal)
$oExcelApp.Quit
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Повысить скорость работы скрипта

Yuriy, спасибо! Все почти заработало.
Только нужно, чтобы русский текст проходил в текстовик изменить
Код:
$xlTextMSDOS = -4158

Но. Не помогло решить вопрос. Экспорт через DDE в лист идет, но даже через объект не читаются строки. При SaveAs идет пустой файл либо предыдущий записанный, но не обновленный.. Буду разбираться дальше. Если есть мысли по этому поводу, буду рад их увидеть.


Добавлено:
Сообщение автоматически объединено:

Еще информация.
Код:
$oFileExcel = ObjGet($sFileExcel)
$L1=$oFileExcel.WorkSheets("1").Cells(2, 2).Value

Таким образом в $L1 значение ячейки 2,2 из листа 1 заносится корректно и без сохранения файла.. Пока единственный метод, позволяющий хоть как-то добраться до содержимого файла. Но, подозреваю, перебирать все нужные ячейки и загонять их в массив окажется долго, через этот метод делал в начале, ОЧЕНЬ долго получилось, на порядки дольше чем через текстовик..
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Повысить скорость работы скрипта

Через
Код:
$aExcel = _ExcelReadSheetToArray($oFileExcel,1,1,1000,5)

Эти 1000 строк в массиве появятся через 5,38 сек.
Посмотрел этот метод в библиотеке, все через цикл по каждой ячейке.
Таким образом, 100 000 строк обрабатываться будут около 9 минут. Дольше, чем вариант с текстом. На много.
Пишу все это для того, чтобы показать, что сделано, дабы отсечь лишние действия..
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Повысить скорость работы скрипта

ViktorSPB
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Повысить скорость работы скрипта" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Администратор форума.
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

to CreatoR
Переименовал.
так удовлетворяет политике форума?
"Обработка Excel2007 не сохраненного листа с максимальной скоростью"
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

ViktorSPB [?]
так удовлетворяет политике форума?
Вполне.
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

to CreatoR
Добрый день!
Скажите, пожалуйста, а можно напрямую данные через DDE принимать, елси мне известен протокол или кодировка.. как правильно назвать..
Увидел Ваш пост http://autoit-script.ru/index.php/topic,2198.0.html
И, я так понимаю, в user32.dll есть методы работы с DDE. Я прав? Если я рассуждаю правильно, то, узнав эти методы, можно подключиться к серверу, с которого по DDE идут данные и получить их напрямую. Не знаю, получится ли замаскироваться под Excel или нет, но наверное, перехватывать можно будет? Если пойти этим путем, то можно будет не мучать Excel для решения моей задачи.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

ViktorSPB,
Посмотрите эту тему: DDEML.au3 - DDE Client + Server
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Добрый день, madmasles!
Сейчас уже чуть больше понимаю в AutoIt, буду разбираться с этой библиотекой. У меня эта ссылка была и раньше, но тогда я не разобрался и услышал, что через неё не получалось у человека данные получить или что-то еще, не помню уже. Сейчас буду разбираться. Спасибо, что напомнили, а то полез опять в дебри...


Добавлено:
Сообщение автоматически объединено:

madmasles, скажите, пожалуйста, а макро надо отдельно прописывать, подключать. У меня ругается на @unicode, а он есть даже в русском хэлпе.. Я думал макро, это внутренние функции AuioIt и новые макро не прописать..

Причем в русском старом хэлпе описание есть, а в новом английском уже нет..
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

ViktorSPB [?]
Причем в русском старом хэлпе описание есть
Удалите его и скачайте актуальный здесь.
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Спасибо, скачал. Я пользовался английскими хэлпами новыми, на родном языке приятнее, конечно) А что с макро? скопировал новые библиотеки, все-равно ругается.. Как быть с @unicode? Он устарел и надо другой прописывать или можно все-таки макро подгружать как функцию?

Вот фрагмент с ним, и еще есть макро не подсвечивающиеся и не исполняющиеся..
Код:
If $pSendMessage[0] = 0 Then
			If @Unicode Then

вот еще один - @ProcessorArch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

ViktorSPB,
Поменяйте версию DDEML.au3 на 1.5.4
 

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Вот код позволяющий многократно увеличить скорость считывания с Excel:
Код:
#include <Excel.au3>
#include <Array.au3>
Local $oExcel = _ExcelBookNew() ;Create new book, make it visible

; We can fill-up some cells using a simple loop and random Numbers
For $y = 1 To 100 ;Start on Column 1
	For $x = 1 To 100
		_ExcelWriteCell($oExcel, Round(Random(1000, 10000), 0), $x, $y) ;Some random numbers to file
	Next
Next
local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArrayQuick($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArrayQuick: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArray($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArray: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

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   ;==>_ExcelReadSheetFromArrayQuick

Результат:

_ExcelReadSheetToArrayQuick: 23.0465045138418
_ExcelReadSheetToArray: 10237.6740619269
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Dreadfulangel,
не понимаю.. Запускаю Ваш скрипт, все быстро обрабатывается.
Подключаю свой лист и выскакивает ошибка здесь
Код:
$avRET = $oExcel.Application.WorksheetFunction.Transpose($oExcel.Activesheet.Cells($iStartRow, $iStartColumn).Resize($iRowCnt, $iColCnt).Value) ; здесь происходит считывание целым массивом, а не по элементно

Что методу в моем листе не нравится?
Мой вариант:
Код:
#include <Excel.au3>
#include <Array.au3>


$sFileExcel = 'C:\STORAGE\RTSI.xlsx';
Local $oExcel =  _ExcelBookAttach($sFileExcel,'FilePath');
;Local $oExcel = _ExcelBookNew() ;Create new book, make it visible


; We can fill-up some cells using a simple loop and random Numbers
;For $y = 1 To 100 ;Start on Column 1
;    For $x = 1 To 100
;        _ExcelWriteCell($oExcel, Round(Random(1000, 10000), 0), $x, $y) ;Some random numbers to file
;    Next
;Next
local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArrayQuick($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArrayQuick: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArray($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArray: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

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   ;==>_ExcelReadSheetFromArrayQuick


Дело в формате данных или в их количестве?
И сразу вопрос, а если не известно кол-во строк, а только столбцов, будет метод работать?


Добавлено:
Сообщение автоматически объединено:

to madmasles
Версию новую скачал, а примеры там старые.. Сложно проверить работу. Буду разбираться со структурой старых примеров..
Кроме того. Версия библиотеки обновлена, а внутри используются старые библиотеки, например DllCallBack. А в ней опять этот @unicode..
Это же наверное элементарный макрос, нужно его переписать в билиотеке? Я правильно рассуждаю?

CreatoR, я видел Ваше общение на форуме по поводу этой библиотеки с piccaso. Значит Вы использовали её. Подскажите, пожалуйста, как заставить её работать на текущей версии? Одного обновления DDEML не достаточно, правильно? А если переписать, то я могу найти старый хэлп, разобраться, и, думаю, перепишу сам, но хотелось бы узнать Ваше мнение. Может это вообще малопригодная для работы билиотека и я за мельницами гоняюсь..

Нашел описания макро, правлю скрипты. На сколько я понял мне надо удалить все проверки на @unicode, поскольку текущие версии AutoIt всегда @unicode. И @ProcessorArch заменяю на @OSArch
 

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

если не известно кол-во строк, а только столбцов, будет метод работать?
По умолчанию функция сама определяет последнюю заполненую ячейку на листе и заполняет массив.

Подправил немного определение $sLastCell,проверьте сейчас.

Код:
#include <Excel.au3>
#include <Array.au3>
Local $oExcel = _ExcelBookNew() ;Create new book, make it visible

; We can fill-up some cells using a simple loop and random Numbers
For $y = 1 To 100 ;Start on Column 1
	For $x = 1 To 100
		_ExcelWriteCell($oExcel, Round(Random(1000, 10000), 0), $x, $y) ;Some random numbers to file
	Next
Next
local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArrayQuick($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArrayQuick: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

local $iTimer=TimerInit()
$aArray = _ExcelReadSheetToArray($oExcel) ;Using Default Parameters
ConsoleWrite("_ExcelReadSheetToArray: "&Timerdiff($iTimer) & @LF)
_ArrayDisplay($aArray, "Array using Default Parameters")

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)
	Local $sLastCell = $oExcel.Activesheet.Cells.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   ;==>_ExcelReadSheetFromArrayQuick
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Dreadfulangel, спасибо!
Заработало. мои 58000 строк обработало за 1073 мс. Обычный метод все еще жду)
Единственное, формат данных, которые отображаются в массиве не тот, не то что у меня на экране отображается.
например дата 21.12.2011 - 20111221000000
время 10:00:03 - 0.416701388888889
Я еще не до конца разобрался с регулярными выражениями, разберусь обязательно, сейчас хочу только спросить. Я смогу данные в массив забить в своем формате, чтобы время было HHMMSS, а дату YYYYMMDD? Метод примет мои преобразования без существенных потерь по времени? А то я метод Ваш не совсем понимаю.. Если по-строков, то все ясно, получаю на входе что вижу и дальше привожу к формату. А у Вас я получаю не то что вижу на экране.. потому и спрашиваю.

Даже не надо преобразовывать как мне надо, а чтобы в массиве было то, что я вижу на листе.

А вот и результат без времени на задержку с показом массива.
_ExcelReadSheetToArrayQuick: 1088.8832076211
_ExcelReadSheetToArray: 242785.350885047
 

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

Отличие _ExcelReadSheetToArrayQuick от _ExcelReadSheetToArray (стандартная из UDF), только в том что она считывает массив целиком, а не по элементно как стандартная, по этому формат данных можно поменять потом в уже готовом массиве пробежаться по элементам.

Код:
$avRET = $oExcel.Application.WorksheetFunction.Transpose($oExcel.Activesheet.Cells($iStartRow, $iStartColumn).Resize($iRowCnt, $iColCnt).Value)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Обработка Excel2007 не сохраненного листа с максимальной скоростью

ViktorSPB [?]
Единственное, формат данных, которые отображаются в массиве не тот, не то что у меня на экране отображается. например дата 21.12.2011 - 20111221000000время 10:00:03 - 0.416701388888889
Код:
;21.12.2011 - 20111221000000
$sDate = '20111221000000'
$sDate = StringLeft($sDate, 8)
ConsoleWrite('$sDate: ' & $sDate & @LF)

$iPartDay = '0.808171296296296' ;19:23:46
ConsoleWrite(_FormatTimeExcel($iPartDay) & @LF)
ConsoleWrite(_FormatTimeExcel($iPartDay, '%02d%02d%02d') & @LF)
ConsoleWrite(_FormatTimeExcel($iPartDay, '%02d%02d') & @LF)

Func _FormatTimeExcel($i_PartDay, $s_Format = '%02d:%02d:%02d')
	Local $i_Hour, $i_Min, $i_Sec, $i_Day = 86400, $i_Time
	If $i_PartDay > 1 Then $i_PartDay = $i_PartDay - Int($i_PartDay)
	$i_Time = Int($i_Day * $i_PartDay)
	$i_Hour = Int($i_Time / 3600)
	$i_Min = Int(Mod($i_Time, 3600) / 60)
	$i_Sec = Mod($i_Time, 60)
	Return StringFormat($s_Format, $i_Hour, $i_Min, $i_Sec)
EndFunc   ;==>_FormatTime
 
Верх