|
|
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
приходится делать крупный тчет в эксель это график занятости 200 сотрудников по 2 годам с точностью до дня промеры скорости показывают что 95% времени - управление экселом ( форматирование ячеек, вставка примечаний ) вот что уже использую: Set XL = CreateObject("excel.Application") XL.Calculation = -4135 ' xlManual XL.Interactive = False XL.DisplayAlerts = False XL.ScreenUpdating = False все равно медленно. может еще способы есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 16:19:32 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Сократить до минимума обращения к OLE-объектам. Например, ячейки с одинаковым форматированием обрабатывать не по одельности, а одной командой(скопом, так сказать). Или вообще использовать книгу-шаблон, которая сама себя будет форматировать(т.е. будет содержать в себе форматирующий код)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 16:29:27 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
АлексейК <...> промеры скорости показывают что 95% времени - управление экселом ( форматирование ячеек, вставка примечаний ) <...> я бы сказал - 95% времени - управление "полем печати", буде оно затрагивается. РЗЫ совет PA абсолютно универсально правильный. Вариация на тему - копировать форматы с образцов на фактические диапазоны альтернативы - 1) пробовать owc.Spreadsheet.10 с последующим сохранением в книгу. (плюс - inprocess dll) 2) ваять файл напрямую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 16:43:32 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
АлексейКXL.Calculation = -4135 ' xlManual Формулы, наверное, есть? АлексейКпромеры скорости показывают что 95% времени - управление экселом Из них 80% - работа самого Ёкселя по расчетам формул. Наверное, все, что можно считать jet'ом, лучше им и считать. Кстати, .Calculation не оказывает влияния, по крайней мере, если вставлять формулы после заполнения ячеек, которые они считают. А вот и пример (запускать макрос "run me" или отчет - последний работает по результатам макроса): ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 21:15:07 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Выложу и график. Ордината - время работы екселя. Абсцисса - количество заполняемых ячеек, от 100 до 6000 с шагом 100. График "значений" показывает время заполнения числами и форматирования диапазона из соответствующего числа ячеек. График "формул" - вставки соответствующего количества формул, суммирующих такое же количество ячеек с числами. График "формул без пересчета" - то же, что и предыдущее, только с .Calculation=-4135. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 21:28:01 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
да уж, гео научно подошел к вопросу.... в самом деле у меня формул на листе все го порядка 200 - 300 выходит , но по любому лучше их будет вставлять в конце скрипта. насчет форматирования скопом это хорошо , но в конкретном случае существенно усложнит алгоритм - сейчас идет последовательный анализ четырех источников данных и лист форматируется в соответствии с этим. наверное можно результат накапливать в массивах а потом выносить в эксел скопом, но это еще надо придумать как сделать... а вот по owc.Spreadsheet.10 идея нова для меня. этот контрол обладает всем функционалом ёкселя? примечания поддерживает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 09:14:51 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
так же: - убрать нафиг все надстройки - книга будет окрыватся гораздо быстрей (помню после установки промпта с екцелевской надстройкой и включном антивирусе - файл окрывался около 30 сек) - отключить антивирус - проверить сам екцелевский файл (был у меня один такой: все аналогичные ему открываются 1 сек, этот более 5. Оказалось (почему-то) что при загрузке он окрывает панель отправка почты и грузит компоненты отлука (видно по SPY++). Далее оптимизация по коду: (может ты это и так пресно знаешь, но все же...): - работать с ецелем гораздо (на порядок) быстрей с объектом Range в котором находится массив обрабатываемых строк. Т.е. удалять и форматировать не построчно, а сразу кучей строк. >>наверное можно результат накапливать в массивах а потом выносить в эксел скопом, но это еще надо придумать как сделать... Лучше через CopyFromRecordSet ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 09:42:13 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
авторЛучше через CopyFromRecordSet проблема в том что не столько много данных сколько раскраска, формат, вставка примечаний предполагаю что именно примечания тормозят вывод вот фрагментик чтоб было представление о чем речь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 10:06:38 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Есть подозрение, что АлексейК имеет случай, когда формулы стоящие в ячейках есть выражение ссылающееся на другие ячейки, которые представляют собой тоже формулы и так достаточно большой уровень вложенности, если это так так к примеру у меня такой случай привёл к таким показателям скорости выгрузки 120 записей, 4 уровня вложенности - получение нужного массива я для выгрузки 2 сек, передача в Excel - 20 сек (форматирование ячеек и сама передача + группировка), в моём случае шаблон не применим из-за варируемости входных данных, т.е. форматирование ячеек при экспорте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 10:20:12 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
2 Proga вовсе нет, формулы простейшие. в каждом ряду в первой ячейке сумма строки разберусь - сообщу результаты. думаю должно помочь вставка формул последним действием - после вставки значений ЗЫ приятно что мой вопрос вызвал столько откликов. Не думал что можно что - то оптимизировать а тут столько решений .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 10:56:40 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
owc.spreadsheet комментариев не поддерживает. а медленно - это СКОЛЬКО времени? грубо - больше 7-10 сек или меньше? Если меньше - я бы сначала отдышался, прежде чем "опимизировать", если больше 30 - точно засучивать рукава надо. Есть правда запятая с комментариями - это фактически шейпы, создавать их относительно дорого - время твоего форматирования скорее всего временем создания шейпов определяется. Если у тебя количество (межпроцессных) передач данных порядка количества заполняемых ячеек - НЕМЕДЛЕННО выкинуть и переделать. - За вычетом времени подъема екселя выиграешь порядки по времени. идти надо строго по дороге PA вот как, например, можно задать цвет столбцам с нерабочими днями (стиль ссылок A1C1) With Range("B:C,H:I,M:N") .Font.ColorIndex = 3 With .Interior .ColorIndex = 36 .Pattern = 1 'xlSolid .PatternColorIndex = -4105 'xlAutomatic End With End with все-таки, попробуй сократить для начала суммарное количество вызовов по присвоению значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 11:39:20 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
по времени сейчас: грубо если отчет на один лист (по полугодию) и по группе из 10 человек - около 10 сек если порядка 300 человек и 4 листа (за 2 года) то до 30 минут сейчас пробую оптимизацию формул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 11:58:54 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
О-го!! Тогда целиком присоединяюсь к словам PA и Виктоши. Уменьши количество обращений к экселю. Формируй строки обращений в акцессе ("A:B, F:G, L:M") и обрабатывай диапазоны скопом. То, что ставится по умолчанию (xlSolid и т.п.), не переставляй еще раз. Все, что можно ставить CopyFromRecordset, им и ставь. Лучше сделать несколько запросов, если в один данные не влазят, и из них группами покласть. Посчитал на медленной машине: заполнение и форматирование 1000 ячеек ёкселя по одной из акцесса на небыстрой машине - 32.6 сек, заполнение и форматирование 10 раз по 100 ячеек - 0.74 сек. Формулы, тем более несложные, такого влияния не окажут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 12:34:30 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
А никто не пробовал ХМЛ слепить типа <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"><?xml version="1.0"?> .... а потом скормить его Excel'ю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 12:46:51 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Alexey ShА никто не пробовал ХМЛ слепить типа <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"><?xml version="1.0"?> .... а потом скормить его Excel'ю? пробовал, оч. карашо,ОЧ. Могло бы заменить трансфер с усбехом, но 1) нет времени привести в приличный вид 2) разница в размерах файла с "родным" форматом нелинейно растет при увеличении числа заполненных клеток. что-то типа - xls - 400К, xml - 2M При этом на коротких таблицах из нескольких клеток - ровно наоборот - xml заметно компактнее xls. 3) с картинками, кажется, проблема. баловался в начале года, подробностей не помню. 4) усбех начиная с ексель2002, в 2000, все-таки, похоже надо html ваять, и формат его (того html-a) кажется умирающим. Примечания, между прочим, точно сохраняются. Нет уверенности, что доделаю, однако интерес есть, т.к. может оказаться в некоторых ситуациях наилучшим решением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 15:41:48 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
снова засада вместо форматирования по ходу кода решил собрать для одинаковых типов ячеек строковые переменные со списком ячеек региона и трабл параметр метода range и функции convertformula не может быть больше 256 символов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. блин придется бить строку на куски ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 10:22:02 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
про длинную строку - отдельно, про стиль ссылок отдельно про стиль - просто установи нужный на этапе вычислений dim oldStyle oldStyle=XL.ReferenceStyle XL.ReferenceStyle = -4150 'xlR1C1 'много вычислений '... 'возвращаем 'XL.ReferenceStyle = 1 'xlA1 XL.ReferenceStyle =oldStyle про длину строки в любом случае 'типа : R9C4,R9C5,R9C6,R9C7,R9C8,R9C9,R9C10,R9C11,R9C12,R9C13,R9C14,R9C15,R9C16 лучше привести к виду 'типа : R9C4:R9C16 у тебя же клетки в строке подряд идут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 11:17:24 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Добавлю и я что ли пару строчек от себя. Самому приходится постоянно работать с выводом отчетом в Excel. Тут все правильно сказали, что главный тормоз - это обращение к Excel (как вариант уменьшения кол-ва раз обращений к Excel через макс. общие инструкции уже предлагали).... обращение к Excel именно через OLE-COM. Знакомая многим фишка в том, что макрос запускаемый из Access (через CreateObject(Excel.Application)) работает медленнее чем если бы этот же макрос запускали в САМОМ Excel'е. Однако не многие наверное знают, что для при частых обращениях в макросе к Excel через OLE, эта разница может быть в разы. Как вариант можно предложить АлексейК засунуть этот макрос в Excel и сообщить нам за сколько он отработал. Если разница будет очень ощутимой, можно подумать о том, чтобы не заниматься управлением Excel'ем через OLE, а просто запускать макрос в самом Excel'е. Макрос может быть уже записан там (в том же Personal.xls) или записать его в Excel на лету через библу VBIDE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 11:57:45 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Я видел библиотеки для формирования файла экселя напрямую, но 2года назад разобраться, как их правильно использовать, было ОЧЕНЬ не просто, зато скорости (с чухих слов) в сотни раз больше. IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 13:02:34 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
давайт попросим АлексейК довести до результата вариант Ускорение формирования экселовского отчета и Ускорение формирования экселовского отчета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 13:35:28 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
2 SergeySV разница БУДЕТ ощутимой, без если. Однако, ЕСЛИ ему уастся прийти к приемлемым временам через автоматизацию, то это и будет самый быстрый вариант макроса для непосредственного исполнения в эксель :) типа такое мое скромное мнение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 13:56:00 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
пока сделал функцию которой скармливаю диапазон ячеек в формате R1C1 и нужный формат она бъет регион на куски порядка 200 символов и применяет к глобальному обекту эксел сейчас лист из порядка 300 * 200 ячеек разрисовывает и заполняет данными около 10 секунд супротив 15 минут в предыдущем варианте существенный прогресс можно конечно подумать о оптимизации диапазонов: R1C1,R1C2,R1C3 - > R1C1:R1C3 но пока ничего быстрого не приходит в голову Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. в данный момент мне быстрее и не надо так как планирую запихнуть форматирование эксела в область ожидания ассинхронной загрузки данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 15:44:28 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
2 АлексейК Поздравляю прогрессом ;) Дальше улучшения, конечно, не так заметны будут, но, все-таки как-то нездорово у тебя со строкой диапазонов вышло... Может, покажешь код, которым набираешь строку с диапазоном? Там наверно, что-то бегающее по рекордсету... Может кака мысь посетит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 16:02:37 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
по рекордсету сотрудников по месяцам полугодия дням рекодсета месяца текущего сотрудника проверка условий на форматирование и набор строк типа: if .. FormatYelow = FormatYelow & "," & "R" & CRow & "C" & foundcol else FormatGreen = FormatGreen & "," & "R" & CRow & "C" & foundcol в конце вызов процедуры форматирования этих диапазонов: Call ExcelOut(FormatYelow, "", 36) Call ExcelOut(FormatGreen, "", 4) Call ExcelOut(FormatGrayMinus, "-", 15) Call ExcelOut(Format8, "8", "") Call ExcelOut(FormatSUMH, "=SUM(RC[1]:RC[222])", "") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 16:48:35 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
авторпо рекордсету сотрудников по месяцам полугодия дням рекодсета месяца текущего сотрудника вопрос: это один запрос с джойном или 3 вложенных цикла? там еще комментарии с именами пректов проскакивали. вечером поковыряю в носу. Все таки полный код на тек. момент лучше было бвидеть. Ну, что-нибудь придумается.... (на вопрос: можно и не отвечать, если выложить структуру базы с примером заполнения на 2-3 строки, или тестовый файлик с кодом с прмером заполнения- если вырезается недолго) как накладываются 8 36 4 15 на данные 8 - видимо работал(?) 36 - выходной? 4-15 прогул-бюллетень? ЗЫ по заявленному, делал, наверно бы так - 1) сваял левый джойн календарной таблицы на сотрудников и табель 2) вычитал его в массив за раз (ADODB.Recordset.GetRows) 3) по размеру получившегося массива посчитал бы границы диапазона 4) типа MyRange.VAlue = XL.WorksheetFunction.Transpose(MyArrayFromDB) 5) добавил бы итоговый столбец 6) форматировал - возможно, хватило бы условного форматирования. где-то рядом перекресные таблицы со сводными запросами лежали - тоже можно поковырять, но на бегу очевидного предложения пока нет. Между прочим, xml-выгрузка тоже должна хорошо смотреться. Хотя по совокупности, может и не обгонит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 18:05:43 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32733256&tid=1671055]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 369ms |

| 0 / 0 |
