Что нового

Обработка Excel в AutoIt 3.3.12.0 медленнее чем в AutoIt 3.3.8.1 Как ускорить

pvnn

Осваивающий
Сообщения
305
Репутация
32
Необходимо физически пробежаться по всем записям в Excel файле
Код на AutoIt 3.3.12.0 работает медленнее чем на AutoIt 3.3.8.1
Как-то можно увеличить производительность в AutoIt 3.3.12.0?
(Office 2013, Win7 x86)

Пример AutoIt 3.3.12.0
Код:
#include <Excel.au3>
 #include <Timers.au3>
 #include <MsgBoxConstants.au3>

 $oAppl = _Excel_Open()
 $oWorkbook=_Excel_BookNew($oAppl)

 $kol=500
 $starttime = _Timer_Init() ; Инициируем Таймер
 For $i=1 To $kol
        _Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Cells($i,1))
        ;_Excel_RangeRead($oWorkbook,Default,'A'&$i)
 Next
 MsgBox(64,'Чтение записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')

 $starttime = _Timer_Init() ; Инициируем Таймер
 For $i=1 To $kol
        _Excel_RangeWrite($oWorkbook,Default,'test',$oWorkbook.ActiveSheet.Cells($i,1))
 Next
  MsgBox(64,'Запись записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')
 _Excel_Close($oAppl)
Время Чтения 500 записей = 30 сек.
Время Записи 500 записей = 2 сек.

Пример AutoIt 3.3.8.1

Код:
#include <Excel.au3>
 #include <Timers.au3>

 $oWorkbook = _ExcelBookNew()

 $kol=500
 $starttime = _Timer_Init() ; Инициируем Таймер
 For $i=1 To $kol
         _ExcelReadCell($oWorkbook,$i,1)
 Next
 MsgBox(64,'Чтение записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')

 $starttime = _Timer_Init() ; Инициируем Таймер
 For $i=1 To $kol
        _ExcelWriteCell($oWorkbook,'test',$i,1)
 Next
  MsgBox(64,'Запись записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')
 _ExcelBookClose($oWorkbook)
Время Чтения 500 записей = 2 сек.
Время Записи 500 записей = 2 сек.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
inververs с массивом мне все понятно, но иногда бывает необходимость пробежаться именно по строчкам Excel. Например, я бегу по строкам в Excel, считываю данные и сразу же добавляю в эту строку дополнительные данные относительно считанных

Код:
_Excel_RangeWrite
в цикле же быстро отрабатывает, хотя тоже позволяет записывать данные из массива целиком
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну так и беги по строчкам в массиве и пиши что нужно. в чем проблема то?
чтение пятисот строк - 0.5 сек
Код:
#include <Excel.au3>
Local $t = TimerInit()
Local $oAppl = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oAppl, @ScriptDir & "\test.xlsx")
Local $aResult = _Excel_RangeRead($oWorkbook)
For $i = 0 To UBound($aResult) - 1
	ConsoleWrite($aResult[$i] & @LF)
Next
MsgBox(0,'',TimerDiff($t))
_Excel_Close($oAppl)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
pvnn [?]
пробежаться именно по строчкам
Код:
For $i=1 To $kol
        $oWorkbook.ActiveSheet.Cells($i,1).Value
        ;_Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Cells($i,1))
        ;_Excel_RangeRead($oWorkbook,Default,'A'&$i)
 Next
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
InnI Спасибо! Как раз то, что нужно
Тема решена
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
pvnn
так, все-таки, время не важно? ведь последний вариант, чтение по строкам гораздо медленнее
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner
в данном, конкретном случае мне нужно было именно по строкам пробежаться
и в цикле Excel_RangeRead оказалось использовать не эффективно
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
pvnn
чтение в массив и пробежать в массиве по строкам в разы быстрее. тема для этого и была создана - как ускорить.
я не спорю. нравится - используй. но это не ускорение. а значит не эффективно. я так это вижу
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
joiner сказал(а):
pvnn
чтение в массив и пробежать в массиве по строкам в разы быстрее.
Полностью поддерживаю. Применительно к этой ситуации исправил бредовый первый код(тот, что про 30 сек)
Код:
#include <Excel.au3>
#include <Timers.au3>
#include <MsgBoxConstants.au3>

$Excel_book = @ScriptDir & '\123.xlsx'

$oAppl = _Excel_Open()
$oWorkbook=_Excel_BookOpen($oAppl,$Excel_book)

$starttime = _Timer_Init() ; Инициируем Таймер
$mass = _Excel_RangeRead($oWorkbook,"1","A1:CC10000")
MsgBox(64,'Чтение записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')

$starttime = _Timer_Init() ; Инициируем Таймер
_Excel_RangeWrite($oWorkbook,'2',$mass)
MsgBox(64,'Запись записей','Время обработки: '&Round(_Timer_Diff($starttime)/1000)&' сек.')


Читаем много в листе "1", потом что-то делаем там с данными, пишем результат в лист "2"
Но это конечно применительно а версии AutoIt 3.3.12.0 и не для всех данных
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
...ну почему так сложно то...
Да действительно, получилось немного путано, тема слишком объемна: "Обработка Excel Как ускорить", но внутри темы есть же пояснение: "Необходимо физически пробежаться по всем записям в Excel файле". Где здесь слово массив?! Да, массив эффективнее и удобнее, но и алгоритм должен быть соответствующий. Мне нужно было быстро переделать программу, написанную на старом Autoit, чтобы обойтись малой кровью, поэтому и вопрос был именно про физически пробежаться... Пример был составлен, чтобы показать что конструкция в цикле с _Excel_RangeRead работает медленно. Вот я и искал альтернативу.

СН3СН2ОН прежде чем называть чей-то код бредовым, необходимо сначала хотя бы попытаться вникнуть в суть вопроса. И еще, не слишком-ли громкое заявление для пользователя с репутацией 2

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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
pvnn [?]
"Необходимо физически пробежаться по всем записям в Excel файле".
но это не вяжется со скоростью. хотя, дело вкуса. лишние десять секунд роли не играют. и понятие "физически", в программировании, весьма виртуально :smile:.
OffTopic:
насчет
Дальнейшее обсуждение будет просто флудом
кто будет считать? автор темы? никто никому ничего не навязывает. только сказав "А", последовательно будет услышать "Б"
можно было и не писать ответ, раз все решено :smile:
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
А раз тема не решена, отмечусь :smile:
Бредовым я посчитал этот код
Код:
For $i=1 To $kol
        _Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Cells($i,1))
        ;_Excel_RangeRead($oWorkbook,Default,'A'&$i)
 Next

Зачем ячейку класть в массив?
Из-за этого такие секунды.
Вернее будет.

InnI сказал(а):
pvnn [?]
пробежаться именно по строчкам
Код:
For $i=1 To $kol
        $oWorkbook.ActiveSheet.Cells($i,1).Value
        ;_Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Cells($i,1))
        ;_Excel_RangeRead($oWorkbook,Default,'A'&$i)
 Next
.


Ну это на файлах до 10000 тыс позиций(строк), можно попить чай, а если больше? Ведь вопрос был в быстроте.
 
Верх