|
23.10.2008, 18:43 | #1 |
Moderator
|
visible(true) для Excel, конечно, в самом конце делаете? Если нет, то сделайте в самом конце.
Еще можно для Excel перед циклом поставить Application.ScreenUpdating(false), а после - Application.ScreenUpdating(true). Даже при visible = false это дает некоторую экономию по времени. |
|
23.10.2008, 18:51 | #2 |
Участник
|
приложение делаю видимым по окончании выгрузки...
|
|
23.10.2008, 19:00 | #3 |
Moderator
|
Поскольку мне неоткуда почитать картинки из таблицы, набросал джоб, выводящий в файл 400 фрагментов экрана (image.captureScreen). Время работы 2-3 секунды.
X++: static void Job98(Args _args) { ComExcelDocument_RU doc = new ComExcelDocument_RU(); Image image = new Image(); COM xlApp; COM wbook; COM activeSheet; COM range; int i, timeStart; ; timeStart = timenow(); doc.NewFile('',false); wbook = doc.getComDocument(); xlApp = wbook.Parent(); activeSheet = xlApp.ActiveSheet(); range = activeSheet.Range('B1'); xlApp.ScreenUpdating(false); for (i=1;i<=400;i++) { image.captureScreen(0+(i-1)*2, 0+(i-1)*2, 300+(i-1)*2, 100+(i-1)*2); image.clipboardCopy(); range.RowHeight(78); //range.Select(); //activeSheet.Paste(); range.pasteSpecial(0); range = range.Offset(1,0); } xlApp.ScreenUpdating(true); doc.visible(true); box::info(strFmt('Всего секунд: %1', timenow()-timeStart)); } Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано? Что-то подобное мы уже обсуждали здесь: Параметры pastespecial() |
|
|
За это сообщение автора поблагодарили: gl00mie (3), Molchun (1). |
23.10.2008, 19:41 | #4 |
Участник
|
Спасибо всем за помощь! :-)
|
|
23.10.2008, 20:13 | #5 |
Moderator
|
Цитата:
Сообщение от Gustav
Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано?
X++: range.pasteSpecial( 0 ); range.pasteSpecial( 01\01\1900 ); range.pasteSpecial( false ); range.pasteSpecial( '' ); range.pasteSpecial( 'какая-то фигня непонятная...'); range.pasteSpecial( COMArgument::NoValue ); range.pasteSpecial( COMVariant::createNoValue() ); |
|
|
|