Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5911
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.18 13:32. Заголовок: Работа с Ole из HBWIN
Pasha пишет: цитата: | после этого можно перейти на использование класса win_oleAuto из библиотеки hbwin, заменив строку oExcel := CreateObject( "Excel.Application" ) на win_oleCreateObject( "Excel.Application" ) Используя класс win_oleAuto, можно вместо передачи через буфер обмена передавать в Excel всю таблице одним вызовом __oleVariantNew() В принципе передача через буфер обмена фрагментами по 20к тоже работает быстро, но можно и делать это прямой записью. |
| Сделал такую конструкцию: #xcommand TRY => BEGIN SEQUENCE WITH {|__o| break(__o) } #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> ..... Try oExcel := win_oleCreateObject( "Excel.Application" ) Catch MsgStop( "Excel not available. [" + win_oleErrorText() + "]", "Error" ) Return Nil End В системе, где не установлен Эксель, не работает !!! Прога вылетает далее на обращении к oExcel:WorkBooks:Add()...: Error BASE/1004 No exported method: WORKBOOKS Called from WORKBOOKS(0) Called from BRW4XLSOLE(74) in module: Tsb4xlsOle.prg Как нужно правильно сделать ?
|
|
|
Ответов - 53
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 5933
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.06.18 16:48. Заголовок: Pasha пишет: Малень..
Pasha пишет: цитата: | Маленький совет по оптимизации |
| Спасибо БОЛЬШОЕ ! Буду переделывать... Pasha пишет: цитата: | Можно же эти действия делать не для каждой ячейки отдельно, а выделить некую область (например, колонку таблицы, одну или несколько) |
| Да я выкинул этот алгоритм из Ворда, оставил в качестве примера для Экселя - там это шустрей происходит. И алгоритм переноса фонтов и цвета с таблицы Tsbrowse в Эксель и Ворд - делаю по блокам, т.е. по нескольким строкам. Скорость просто возросла на порядок ! Желающие потом сами могут протестировать, когда пример будет готов. Первая версия примера у Григория в библиотеке Tsb_Export.
|
|
|
|
| постоянный участник
|
Пост N: 5935
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.18 17:41. Заголовок: Тестировал Tsb_Expor..
Тестировал Tsb_Export в Word 2003/2007/2010 - работает отлично. Под Word 2016 вылетает с ошибкой: Error WINOLE/1009 No exported method: BOOKMARKS (DOS Error -2147418111) Called from WIN_OLEAUTO:BOOKMARKS(0) Called from BRW4DOCOLE(102) in module: Tsb4DocOle.prg Called from TOWINWORD4(1237) in module: demo2.prg Called from (b)TABLEEXPORT(719) in module: demo2.prg Called from _DOCONTROLEVENTPROCEDURE(0) Вот код: IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == NIL cMsg := REPLICATE( "-._.", 16 ) + ";;" IF Hb_LangSelect() == "ru.RU1251" cMsg += "MS Word не доступен !;; Ошибка" cVal := "Ошибка!" ELSE cMsg += "MS Word is not available !;; Error" cVal := "Error!" ENDIF cMsg += " [ " + win_oleErrorText() + " ];;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , cVal ) RETURN Nil ENDIF oActive :=oWord:Documents:Add() oMarks := oActive:BookMarks // вот здесь 102 строка oText := oWord:Selection() Как исправить/изменить, чтобы работал код и в Word 2016 ?
|
|
|
|
| Администратор
|
Пост N: 3754
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.07.18 21:13. Заголовок: Andrey пишет: Как и..
Andrey пишет: цитата: | Как исправить/изменить, чтобы работал код и в Word 2016 ? |
| Есть такая проблема. Сталкиваюсь с ней уже года три. Новые версии Office (2013, 2016) - вещь непредсказуемая. Хотят - работают, не хотят - не работают. У меня дома как раз стоит Word 2016. Дней 10 назад я проверял выгрузку в Word через dbedit, и вываливалась похожая ошибка, при обращении не к Bookmarks, а к Tables. Сейчас на том же компьютере запустил тот же dbedit - ошибки нет. Иногда возникают непонятные ошибки с последними версиями Excel
|
|
|
|
| постоянный участник
|
Пост N: 1903
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.18 21:45. Заголовок: Andrey пишет oA..
Andrey пишет цитата: | oActive :=oWord:Documents:Add() oMarks := oActive:BookMarks // вот здесь 102 строка oText := oWord:Selection() |
| Вероятно oActive == NIL не объект, который не успел сформироваться, передаться. Попробуй сделать задержку inkeygui(100) \ DoMessageLoop() до получения объекта
|
|
|
|
| постоянный участник
|
Пост N: 5936
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.18 21:48. Заголовок: Pasha пишет: Новые ..
Pasha пишет: цитата: | Новые версии Office (2013, 2016) - вещь непредсказуемая. Хотят - работают, не хотят - не работают. |
| А попробуй пожалуйста пример, который я высылал тебе. Там выгрузка в Ворд - работает ?
|
|
|
|
| Администратор
|
Пост N: 3755
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.07.18 21:55. Заголовок: Andrey пишет: А поп..
Andrey пишет: цитата: | А попробуй пожалуйста пример, который я высылал тебе. Там выгрузка в Ворд - работает ? |
| Сейчас работает. Но не факт, что завтра будет работать. У меня тоже сейчас работает, а 10 дней назад та же функция на том же компьютере с тем же word не работала.
|
|
|
|
| Администратор
|
Пост N: 3756
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.07.18 22:03. Заголовок: SergKis пишет: Веро..
SergKis пишет: цитата: | Вероятно oActive == NIL не объект, который не успел сформироваться, передаться. Попробуй сделать задержку inkeygui(100) \ DoMessageLoop() до получения объекта |
| Это конечно вариант. Но помню году так в 15-м я сломал голову с ошибками при выгрузке в Excel 2013 на одном ноуте. Выгрузка иногда выполнялась до конца, а чаще нет, причем ошибки возникали каждый раз разные при обращении к различным объектам. Никакой закономерности я тогда так и не увидел.
|
|
|
|
| постоянный участник
|
Пост N: 1457
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.07.18 22:10. Заголовок: SergKis пишет: Веро..
SergKis пишет: цитата: | Вероятно oActive == NIL не объект, который не успел сформироваться, передаться. Попробуй сделать задержку inkeygui(100) \ DoMessageLoop() до получения объекта |
| Очень похоже, учитывая нестабильность ошибки. Нужна пауза.
|
|
|
|
| |
Пост N: 6853
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.18 22:25. Заголовок: PSP пишет: Очень по..
PSP пишет: цитата: | Очень похоже, учитывая нестабильность ошибки. Нужна пауза. |
| При чем тут она ? Павел же пишет что при обращении к объектам. Не ставить же паузу перед каждой строкой при обращении........
|
|
|
|
| постоянный участник
|
Пост N: 5937
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.18 22:30. Заголовок: SergKis пишет: Веро..
SergKis пишет: цитата: | Вероятно oActive == NIL не объект, который не успел сформироваться, передаться. Попробуй сделать задержку inkeygui(100) |
| Заработала в этом варианте ! Но в другом варианте нет - не заработало ! Там вызов другой, через переходник: Try oWord := CreateObject( "Word.Application" ) Catch cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += SPACE( 5 ) + "On this computer MS Word is not installed !;;" cMsg += SPACE( 5 ) + " Error code [" + win_oleErrorText() + "];;" cMsg += SPACE( 5 ) + " Error code [" + Ole2TxtError() + "];;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error!" ) Return .F. End Try Ну хоть одно решение есть !!! Как пример закончу, то выложу для тестирования.
|
|
|
|
| постоянный участник
|
Пост N: 1458
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.07.18 22:41. Заголовок: Dima пишет: При чем..
Dima пишет: цитата: | При чем тут она ? Павел же пишет что при обращении к объектам. Не ставить же паузу перед каждой строкой при обращении........ |
| Ошибка непостоянна. Это значит, что объект создается, но "не всегда вовремя") У Андрея задержка "сработала". Значит нужно учитывать эту особенность всегда.
|
|
|
|
|
| постоянный участник
|
Пост N: 1904
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.18 22:47. Заголовок: Dima пишет При чем т..
Dima пишет цитата: | При чем тут она ? Павел же пишет что при обращении к объектам. Не ставить же паузу перед каждой строкой при обращении........ |
| Там где формируется сторонний объект - придется ставить. проверка по valtype(...) != 'O' Помнится в "лохматых" годах 200 мсек было мало, ставили наверняка 500 мсек
|
|
|
|
| |
Пост N: 6854
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.18 22:48. Заголовок: PSP пишет: Ошибка н..
PSP пишет: цитата: | Ошибка непостоянна. Это значит, что объект создается, но "не всегда вовремя") |
| ок
|
|
|
|
| Администратор
|
Пост N: 3757
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.07.18 23:02. Заголовок: Пока собрался ответи..
Пока собрался ответить, колумбийцы забили гол :) Андрей, твой пример и у меня сваливался. Вяляется Errlog.htm: Date: 27.06.2018 Time: 22:01:28<BR> Time from start: 0 days 0 hours 0 mins 56 secs<BR> Error WINOLE/1009 No exported method: BOOKMARKS (DOS Error -2147418111) Called from TOLEAUTO:BOOKMARKS(0) У тебя идет обращение к Bookmarks сразу после oWord:Documents:Add() У меня последовательность другая: oDoc := oWord:ActiveDocument oSel := oWord:Selection oSel:Font:Name := 'Arial' oSel:Font:Size := 12 oSel:InsertAfter(cText) .. oDoc:Tables:Add(oSel:Range, 1, nColCount) здесь при обращении к Tables программа сваливается: Error description: Error Word.Application:ACTIVEDOCUMENT/1 Unknown error: TABLES то есть после создания документа удалось таки выполнить с ним несколько операций перед сваливанием
|
|
|
|
| Администратор
|
Пост N: 3758
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.07.18 09:30. Заголовок: Подумалось вот, что ..
Подумалось вот, что сразу после oWord:Documents:Add() oDoc := oWord:ActiveDocument не отработал, а oSel := oWord:Selection отработал. И операции с Selection затем выполнились, а как только было обращение к ActiveDocument, программа свалилась. Это все наводит на грустные мысли. При таком асинхронном выполнении команд может быть все что угодно. Скажем, после добавлении какого-нибудь объекта, например, таблицы, только что добавленная таблица может еще "не существовать", и пойдут ошибки.
|
|
|
|
| постоянный участник
|
Пост N: 5938
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.18 19:58. Заголовок: Pasha пишет: Это вс..
Pasha пишет: цитата: | Это все наводит на грустные мысли. |
| Согласен с этим, но на старых версиях всё работает. Эксель вообще пока без проблем. Нужно наверное под Word 2016 сделать отдельную ветку и всё. Как порекомендуешь это сделать ? IF VAL( oWord:Version ) >= 16 // Word 2016 - не знаю точно прав ли я ? // ???? как здесь сделать ? ELSE oActive :=oWord:Documents:Add() oMarks := oActive:BookMarks oText := oWord:Selection() ENDIF
|
|
|
|
| постоянный участник
|
Пост N: 1910
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.18 20:15. Заголовок: Andrey пишет Согласе..
Andrey пишет цитата: | Согласен с этим, но на старых версиях всё работает. Эксель вообще пока без проблем |
| Сплюнь, а то появится антивирус (не даст экселю работать) и будет без разницы версия ... старая, новая ...
|
|
|
|
| постоянный участник
|
Пост N: 5939
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.18 21:25. Заголовок: SergKis пишет: Сплю..
SergKis пишет: цитата: | Сплюнь, а то появится .... |
| Сплюнул....
|
|
|
|
| постоянный участник
|
Пост N: 1914
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.18 21:31. Заголовок: Andrey Ты этим очен..
Andrey Ты этим очень помог экселю
|
|
|
|
| Администратор
|
Пост N: 3759
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.07.18 21:31. Заголовок: Andrey пишет: // ?..
Andrey пишет: цитата: | // ???? как здесь сделать ? |
| Так причина же непонятна, вот и ответа нет. По доке метод Add должен вернуть объект, а он возвращает непонятно что, и дальнейшие операции с "этим" приводят к ошибке. Есть рекомендация Сергея по задержке, может она поможет. Хотя у меня были похожие проблемы и с Excel, там в произвольных местах лезли непредсказуемые ошибки.
|
|
|
Ответов - 53
, стр:
1
2
3
All
[только новые]
|
|