Автор | Сообщение |
|
| постоянный участник
|
Пост 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: 5913
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.18 13:46. Заголовок: Вот есть вариант что..
Вот есть вариант что предлагал Григорий (только я заменил CreateObject) : IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL MsgStop( "Excel not available. [" + win_oleErrorText() + "]", "Error" ) RETURN Nil ENDIF Можно его использовать, или по другому надо ?
|
|
|
|
| постоянный участник
|
Пост N: 1437
Зарегистрирован: 27.01.07
|
|
Отправлено: 09.06.18 13:47. Заголовок: Ну, эта конструкция ..
Ну, эта конструкция сработает, если будет RTE при вызове win_oleCreateObject. А в твоем случае переменная oExcel получает значение NIL, т.е. никакой RTE не возникает. Проверяй значение oExcel.
|
|
|
|
| постоянный участник
|
Пост N: 1438
Зарегистрирован: 27.01.07
|
|
Отправлено: 09.06.18 13:49. Заголовок: Andrey пишет: Вот е..
Andrey пишет: цитата: | Вот есть вариант что предлагал Григорий (только я заменил CreateObject) : Можно его использовать, или по другому надо ? |
| Именно так.
|
|
|
|
| постоянный участник
|
Пост N: 5914
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.18 13:50. Заголовок: PSP пишет: Проверяй..
PSP пишет: цитата: | Проверяй значение oExcel. |
| А при отсутствии Экселя переменная oExcel := win_oleCreateObject( "Excel.Application" ) действительно равна NIL !
|
|
|
|
| |
Пост N: 6846
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.06.18 13:50. Заголовок: Andrey пишет: Можно..
|
|
|
|
| постоянный участник
|
Пост N: 5915
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.18 13:51. Заголовок: PSP пишет: Именно т..
PSP пишет: СПАСИБО !
|
|
|
|
| постоянный участник
|
Пост N: 5916
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.18 14:06. Заголовок: __oleVariantNew() - ..
__oleVariantNew() - это что то .... Таблица из 25000 строк в Эксель экспортируется за 8 сек. Стандартный метод ExcelOle() делает эту операцию за 58 сек.
|
|
|
|
| постоянный участник
|
Пост N: 5920
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.06.18 15:17. Заголовок: Есть ли возможность ..
Есть ли возможность перенести код из Экселя: cRange := "A" + LTrim(Str(nStart))+":" + Chr( 64 + nColDbf) + LTrim( Str( nLine -1) ) oRange:=oSheet:Range(cRange):Value := __oleVariantNew( WIN_VT_VARIANT, aSet, nIndexaSet, nColDbf ) для Ворда ? Есть ли такой метод в Ворде ?
|
|
|
|
| Администратор
|
Пост N: 3742
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.06.18 15:54. Заголовок: Нет. В ворде есть то..
Нет. В ворде есть только методы insertafter/insertbefore, которым можно передать в качестве параметра только текст, а никак не значения типа Variant или массив
|
|
|
|
| постоянный участник
|
Пост N: 5921
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.06.18 16:23. Заголовок: А как тогда можно ус..
А как тогда можно ускорить процесс переноса таблицы в Ворд ? Т.е. отказаться от буфера обмена...
|
|
|
|
| Администратор
|
Пост N: 3743
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.06.18 16:30. Заголовок: Думаю, что через буф..
Думаю, что через буфер обмена как раз и будет самый быстрый способ. Не по ячейкам же заносить текст.
|
|
|
|
|
| постоянный участник
|
Пост N: 5922
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.06.18 17:15. Заголовок: А если типа так сдел..
А если типа так сделать: var range = doc.Paragraphs(doc.Paragraphs.Count).Range; range.Text = "1,data12,data13\n"+ "1,data22,data23\n"+ "1,data32,data33\n"+ .......... "1,data22,data23\n"+ "1,data32,data33\n"; var table = range.ConvertToTable(",",1,3); https://msdn.microsoft.com/ru-ru/vba/word-vba/articles/range-converttotable-method-word Быстрее будет, чем через буфер обмена ?
|
|
|
|
| Администратор
|
Пост N: 3744
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.06.18 21:17. Заголовок: Andrey пишет: Быстр..
Andrey пишет: цитата: | Быстрее будет, чем через буфер обмена ? |
| Я не пробовал ни через буфер обмена, ни с помощью этого фокуса. О таком фокусе только что и узнал. Наверное речь тут пойдет уже не о скорости, а о применимости такого метода. Одно дело заполнять уже существующую таблицу с готовым форматированием, и совсем другое - автоматически формировать новую таблицу вызовом метода ConvertToTable. А как же шрифт, выравнивание, границы и прочее ? После автоформирования таблицы еще и задавать необходимые свойства ячеек ? Накладно получится.
|
|
|
|
| Администратор
|
Пост N: 3745
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.06.18 08:19. Заголовок: В word есть такая фу..
В word есть такая функция: Преобразовать в таблицу. Это тот же метод ConvertToTable. только с заданием параметров в диалоге. Поиграйся с этой функцией, оцени, насколько она пригодна. На мой взгляд так не очень.
|
|
|
|
| постоянный участник
|
Пост N: 5923
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.06.18 16:29. Заголовок: Pasha пишет: Одно ..
Pasha пишет: цитата: | Одно дело заполнять уже существующую таблицу с готовым форматированием, и совсем другое - автоматически формировать новую таблицу вызовом метода ConvertToTable. А как же шрифт, выравнивание, границы и прочее ? После автоформирования таблицы еще и задавать необходимые свойства ячеек ? Накладно получится. |
| В Ворд как то это всё хитро работает, без пробы и не поймёшь. Сейчас уже испытал заполнение таблицы: ////////// таблица с автоподстройкой по ширине странице (вариант 1) ////////////// oTbl:= oWord:ActiveDocument:Tables:Add(oRange,nRowDbf,nColDbf,wdWord9TableBehavior,wdAutoFitContent) и ///////// таблица без автоподстройки по ширине странице (вариант 2) //////////// oTbl:= oWord:ActiveDocument:Tables:Add(oRange,nRowDbf,nColDbf,wdWord8TableBehavior,wdAutoFitFixed) Всё равно потом приходиться менять ширину колонок таблицы. Напрямую - как ширина колонок в таблице Tsbrowse (источник данных) сделать нельзя, так как экспорт в Ворд задаю как правило другим размером шрифта. Из за этого и приходиться пропорционально ставить ширину колонок в Ворде всегда. Эта операция быстрая. Вот что касается переноса шрифтов, цвета из таблицы Tsbrowse (источник данных) в документ Ворда, то это да - операция "тормоз". Пройтись по каждой ячейки таблицы Tsbrowse потом перенести в Ворд - ! А если 10 тыс.записей таблица ? Тушите свет. Но есть вариант ускорения. Испытал уже на Экселе и Ворде. В Экселе вообще это быстро происходит. Таблица из 1000 строк. HBOLE.LIB экспорт таблицы через буфер обмена одним шрифтом - 00:00:03 HBOLE.LIB экспорт таблицы и перенос цветов и фонтов каждой ячейки - 00:00:44 HBWIN.LIB экспорт таблицы по 100 строк __oleVariantNew() одним шрифтом - 00:00:00 HBWIN.LIB экспорт таблицы и перенос цветов и фонтов по строкам/блокам - 00:00:06 В Ворде чутот помедленнее происходит, да и ещё не доделал...
|
|
|
|
| Администратор
|
Пост N: 3746
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.06.18 16:40. Заголовок: Я в word обычно дела..
Я в word обычно делаю в бланке таблицу с одной (или несколькими) строками с уже готовым форматированием, а затем добавляю нужное мне количество строк вызовом метода InsertRowsBelow().
|
|
|
|
| постоянный участник
|
Пост N: 5924
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.06.18 18:12. Заголовок: Сделал тест для Ворд..
Сделал тест для Ворда. Таблица из 1000 строк. HBOLE.LIB экспорт таблицы через буфер обмена одним шрифтом - 00:00:10 HBOLE.LIB экспорт таблицы и перенос цветов и фонтов каждой ячейки - 00:40:44 Т.е. 40 минут требуется для того чтобы перенести цвета и фонты на таблицу из 1000 строк. Ужас сколько времени.
|
|
|
|
| Администратор
|
Пост N: 3751
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.06.18 14:28. Заголовок: Андрей, я посмотрел ..
Андрей, я посмотрел ваш пример работы с Excel Маленький совет по оптимизации Такой код: oSheet:Cells( nLine, nColHead ):Value := uData oSheet:Cells( nLine, nColHead ):Font:Name := aFont[ 1 ] oSheet:Cells( nLine, nColHead ):Font:Size := aFont[ 2 ] oSheet:Cells( nLine, nColHead ):Font:Bold := aFont[ 3 ] можно написать немного по другому: oRange := oSheet:Cells( nLine, nColHead ) oRange:Value := uData oFont := oRange:Font oFont:Name := aFont[ 1 ] oFont:Size := aFont[ 2 ] oFont:Bold := aFont[ 3 ] В первом случае будет 4 обращения к oSheet, 4 вызова метода Cells, 4 промежуточных обращения к Range, 3 обращения к Font, и по одному к Value, Name, Size, Bold Во в втором случае - все по одному. Обращение к объектам и вызов методов ole - это межпрограммное взаимодействие, а это самая медленная операция. Различия по скорости при выполнении в первом и втором случае думаю очевидны.
|
|
|
|
| Администратор
|
Пост N: 3752
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.06.18 15:55. Заголовок: Andrey пишет: Т.е. ..
Andrey пишет: цитата: | Т.е. 40 минут требуется для того чтобы перенести цвета и фонты на таблицу из 1000 строк. Ужас сколько времени. |
| Можно же эти действия делать не для каждой ячейки отдельно, а выделить некую область (например, колонку таблицы, одну или несколько), и устанавливать для нее соответствующие свойства. Или установить свойства по умолчанию для всей таблицы, а затем менять свойства только тех ячеек, если их значения отличны от значений по умолчанию. Значения же самих ячеек задавать через вставку из буфера обмена.
|
|
|
|
| Администратор
|
Пост N: 3753
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.06.18 14:42. Заголовок: В сырцах TSBrowse ес..
В сырцах TSBrowse есть такое формирования адреса ячейки для Excel: cRange := Chr( 64 + ::aSuperHead[ nCol, 1 ] - nVar ) + LTrim( Str( nLine ) ) + ":" + ; Chr( 64 + ::aSuperHead[ nCol, 2 ] - nVar ) + LTrim( Str( nLine ) ) В том случае, когда номер колонки больше чем 26, адрес будет неправильный. Я для таких целей использую функцию ниже: Function ExcelAdr(nRow, nCol) Return if(nCol>26,Chr(Int((nCol-1)/26)+64),'')+Chr((nCol-1)%26+65) + LTrim(Str(Int(nRow))) и до кучи еще одну функцию (для адреса диапазона ячеек): Function ExcelAdr2(nRow1, nCol1, nRow2, nCol2) Return ExcelAdr(nRow1, nCol1) + ':' + ExcelAdr(nRow2, nCol2)
|
|
|
|
| постоянный участник
|
Пост 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, там в произвольных местах лезли непредсказуемые ошибки.
|
|
|
|
| постоянный участник
|
Пост N: 5940
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.18 22:46. Заголовок: Тестировал программу..
Тестировал программу в Office 2003, 2007, 2010 - экспорт нормально работает. Поставил в Oracle VM VirtualBox Win7 32bit + Office 2016. Программа экспорта в Ворд работает отлично, БЕЗ ВЫЛЕТА !!! Если тестирую на Win10 64bit + Office 2016 на игровом компе (там 8 ядер, 32 ОЗУ), то программа продолжает вылетать. Может быть из-за того что комп не "офисный" ? Может и криво установлен Офис, с какими то дополнениями. Там доп.вопросы возникают - типа Word программа не по умолчанию. Вот такое сообщение: Т.е. нужно тестировать дальше программу на Office 2016 на других компах.
|
|
|
|
|
| постоянный участник
|
Пост N: 5941
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.07.18 14:20. Заголовок: Всем привет ! Выгру..
Всем привет ! Выгружать больше 32767 строк в WinWord НЕЛЬЗЯ ! Ограничение WinWord 2003-2016. Выгружать больше 65533 строк в Excel НЕЛЬЗЯ ! Ограничение Excel 2003. В OO Calc и Excel 2007 - 2016 можно выгружать больше (сколько не уточнял), но появляется окно с предупреждением, которое чаще всего висит под моей программой, так как Экселем запущен в скрытом режиме. А Юзер и не видит это окно, и сразу претензия - программа висит и не работает. Замучился с этим. Как сделать, чтобы это окно можно было выводит на передний план ? Или есть возможность в коде, как то игнорировать такие предупреждения ? P.S. Кстати такие типовые предупреждения появляются и в Ворде и Экселе, если версии созданных документов не совместимы. Юзеру трудно объяснить, как с этим бороться. Хотелось что бы такие сообщения выводились на передний план экрана.
|
|
|
|
| Администратор
|
Пост N: 3764
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.07.18 14:37. Заголовок: Ээ. так есть же oExc..
Ээ. так есть же oExcel:DisplayAlerts, о котором здесь стотыщмильёнов раз говорилось
|
|
|
|
| |
Пост N: 6867
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.18 14:48. Заголовок: Pasha пишет: о кото..
Pasha пишет: цитата: | о котором здесь стотыщмильёнов раз говорилось |
| та даже больше ))
|
|
|
|
| постоянный участник
|
Пост N: 5942
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.07.18 15:15. Заголовок: Pasha пишет: так ес..
Pasha пишет: цитата: | так есть же oExcel:DisplayAlerts, о котором здесь стотыщмильёнов раз говорилось |
| Забыл про это... СПАСИБО !
|
|
|
|
| Администратор
|
Пост N: 3774
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.07.18 16:45. Заголовок: Андрей, я опять запу..
Андрей, я опять запустил твой демо с Excel 2016 Excel дуркует. Идут ошибки, каждый раз в разном месте: Error WINOLE/1006 Argument error: _SIZE (DOS Error -2146777998) Called from WIN_OLEAUTO:_SIZE(0) Called from BRW4XLSOLE(122) in module: Tsb4xlsOle.prg Error WINOLE/1006 Argument error: _SIZE (DOS Error -2146777998) Called from WIN_OLEAUTO:_SIZE(0) Called from BRW4XLSOLE(279) in module: Tsb4xlsOle.prg Error WINOLE/1009 No exported method: FONT (DOS Error -2147418111) Called from WIN_OLEAUTO:FONT(0) Called from BRW4XLSOLE(166) in module: Tsb4xlsOle.prg Error WINOLE/1008 No exported variable: BOLD (DOS Error -2147418111) Called from WIN_OLEAUTO:_BOLD(0) Called from BRW4XLSOLE(141) in module: Tsb4xlsOle.prg Error WINOLE/1007 Argument error: FONT (DOS Error -2147418111) Called from WIN_OLEAUTO:FONT(0) Called from BRW4XLSOLE(166) in module: Tsb4xlsOle.prg Правда один раз пример отработал до конца, обойдя все мины с обращениями к Font, Bold, Size и тому подобное. Я не удивлюсь, если завтра все заработает безупречно. И вопрос: Подскажите пожалуйста почему так происходит и как исправить ?
|
|
|
|
| постоянный участник
|
Пост N: 5962
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.07.18 18:32. Заголовок: Pasha пишет: Андрей..
Pasha пишет: цитата: | Андрей, я опять запустил твой демо с Excel 2016 Excel дуркует. Идут ошибки, каждый раз в разном месте: |
| А может от Офиса это зависит ? Попробуй на другом компе.... Я писал ранее: Тестировал программу в Office 2003, 2007, 2010 - экспорт нормально работает. Поставил в Oracle VM VirtualBox Win7 32bit + Office 2016. Программа экспорта в Ворд работает отлично, БЕЗ ВЫЛЕТА !!! Если тестирую на Win10 64bit + Office 2016 на игровом компе (там 8 ядер, 32 ОЗУ), то программа продолжает вылетать, но ТОЛЬКО Ворд вылетает. Эксель не вылетает ! Может быть из-за того что комп не "офисный" ? Может и криво установлен Офис, с какими то дополнениями. Там доп.вопросы возникают - типа Word программа не по умолчанию. Как программу эту доделаю (твою доработку тоже жду), то выложу для тестировки всем желающим.
|
|
|
|
| постоянный участник
|
Пост N: 1934
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.07.18 19:12. Заголовок: Andrey Если исп. вм..
Andrey Если исп. вместо oSheet:Cells( nLine, nColHead ):Value := uData // oSheet:Cells( nLine, nCol ):Borders():LineStyle := xlContinuous oSheet:Cells( nLine, nColHead ):Font:Name := aFont[ 1 ] oSheet:Cells( nLine, nColHead ):Font:Size := aFont[ 2 ] oSheet:Cells( nLine, nColHead ):Font:Bold := aFont[ 3 ] так oSCell := oSheet:Cells( nLine, nColHead ) ? procname(), procline(), oSCell // oSCell:Value := uData oCFnt := oSCell:Font ? procname(), procline(), oCFnt, aFnt[1], aFnt[2], aFnt[3] oCFnt:Name := aFont[ 1 ] oCFnt:Size := aFont[ 2 ] oCFnt:Bold := aFont[ 3 ] oSCell:Value := uData // переставить DoMessageLoop() // сначала без этой строки потом с ней
|
|
|
|
| постоянный участник
|
Пост N: 5963
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.07.18 20:16. Заголовок: SergKis пишет: Если..
SergKis пишет: Да у меня не вылетает вообще... Нужно Павла просить, чтобы попробовал. Pasha пишет: цитата: | И вопрос: Подскажите пожалуйста почему так происходит и как исправить ? |
| Ну блин, нашли кого спрашивать... Для меня вообще это загадки ...
|
|
|
|
| Администратор
|
Пост N: 3775
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.07.18 20:43. Заголовок: Запустил тест десято..
Запустил тест десяток раз. Один раз отработал до конца, остальные попытки дают вылеты в самых разных местах: при обращении к Font, Size, Cells, Name, Value Так что вряд ли такие изменения помогут. Не в одном, так в другом месте будет вылет. Причина непонятна. Как я уже говорил, сталкиваюсь с таким поведением последних версий Office не первый раз. Запустил свою программу, и прогнал различные варианты выгрузки в Excel. Вылет в некоторых случаях происходит, в некоторых нет.
|
|
|
|
| постоянный участник
|
Пост N: 1462
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.07.18 21:07. Заголовок: Может не в тему, но ..
Может не в тему, но навеяло: вспомните, как винда10 удаляет файл. Даже маленький. Такое впечатление, что сначала она его куда-то отправляет, а потом уже удаляет. Может и со свежими офисами такая же петрушка?
|
|
|
|
| |
Пост N: 6869
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.07.18 21:18. Заголовок: Pasha пишет: Вылет ..
Pasha пишет: цитата: | Вылет в некоторых случаях происходит, в некоторых нет. |
| Та же фигня , но в версии 2003 все норм
|
|
|
|
| Администратор
|
Пост N: 3790
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.18 16:40. Заголовок: Плохая новость. Есть..
Плохая новость. Есть повод поднять темку. Моя винда с экселем с прошлого раза не глючит, но возникла другая проблема у клиента. Алгоритм у меня такой. В документе помечена строка в качестве шаблона (образца). Мне надо заполнить таблицу с данными, и для начала сделать копию этой строки энцать раз. Я это делаю незамысловатым копи-пасте в цикле: Function CopyExcelRows(oDoc, oSheet, cRow, nCount) Local nRow, nCopied := 1, nCopy, s1, cAdr // перемещение на строку oDoc:Goto(cRow) // адрес строки cAdr := oDoc:Selection:Address(.t.,, 1) s1 := 2 if ! (Substr(cAdr, 2, 1) >= '0' .and. Substr(cAdr, 2, 1) >= '9') s1 := At('$', Substr(cAdr, 2)) + 2 endif nRow := Val(Substr(cAdr, s1)) if nRow # 0 // копирование nCount строк while nCopied < nCount nCopy := Min(nCopied, nCount - nCopied) oSheet:Rows(StrTrim(nRow) + ":" + StrTrim(nRow + nCopy - 1)):Copy() oSheet:Rows(StrTrim(nRow+nCopied)+":"+StrTrim(nRow+nCopied)):Insert(-4121) // xlDown nCopied += nCopy enddo else Alert('Неверная закладка ' + cRow) endif Return nRow На злополучном компе эксель при копировании стал выдавать ошибку: "Рисунок слишком велик и будет усечен", и строки естественно не копируются. Хотя там копируется всего-то несколько десяток строк, и никакого рисунка не наблюдается. Поиск в гугле находит массу аналогичных жалоб на подобную ошибку, и обычные шаманские рекомендации как ее преодолеть.
|
|
|
Ответов - 53
, стр:
1
2
3
All
[только новые]
|
|