On-line: PSP, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник




Пост 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

Как нужно правильно сделать ?


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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

Можно его использовать, или по другому надо ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1437
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 09.06.18 13:47. Заголовок: Ну, эта конструкция ..


Ну, эта конструкция сработает, если будет RTE при вызове win_oleCreateObject. А в твоем случае переменная oExcel получает значение NIL, т.е. никакой RTE не возникает. Проверяй значение oExcel.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1438
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 09.06.18 13:49. Заголовок: Andrey пишет: Вот е..


Andrey пишет:

 цитата:
Вот есть вариант что предлагал Григорий (только я заменил CreateObject) :
Можно его использовать, или по другому надо ?


Именно так.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5914
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.06.18 13:50. Заголовок: PSP пишет: Проверяй..


PSP пишет:

 цитата:
Проверяй значение oExcel.


А при отсутствии Экселя переменная oExcel := win_oleCreateObject( "Excel.Application" ) действительно равна NIL !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6846
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.06.18 13:50. Заголовок: Andrey пишет: Можно..


Andrey пишет:

 цитата:
Можно его использовать, или по другому надо ?


Хотя бы как в этой теме Start_Excel (только его надо переделать под твои нужды)
http://clipper.borda.ru/?1-4-0-00000876-000-0-0-1373554002

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5915
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.06.18 13:51. Заголовок: PSP пишет: Именно т..


PSP пишет:

 цитата:
Именно так.


СПАСИБО !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5916
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.06.18 14:06. Заголовок: __oleVariantNew() - ..


__oleVariantNew() - это что то ....
Таблица из 25000 строк в Эксель экспортируется за 8 сек.
Стандартный метод ExcelOle() делает эту операцию за 58 сек.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 )

для Ворда ?
Есть ли такой метод в Ворде ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3742
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.06.18 15:54. Заголовок: Нет. В ворде есть то..


Нет. В ворде есть только методы insertafter/insertbefore, которым можно передать в качестве параметра только текст, а никак не значения типа Variant или массив

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5921
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.06.18 16:23. Заголовок: А как тогда можно ус..


А как тогда можно ускорить процесс переноса таблицы в Ворд ?
Т.е. отказаться от буфера обмена...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3743
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.06.18 16:30. Заголовок: Думаю, что через буф..


Думаю, что через буфер обмена как раз и будет самый быстрый способ. Не по ячейкам же заносить текст.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Быстрее будет, чем через буфер обмена ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3744
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.06.18 21:17. Заголовок: Andrey пишет: Быстр..


Andrey пишет:

 цитата:
Быстрее будет, чем через буфер обмена ?



Я не пробовал ни через буфер обмена, ни с помощью этого фокуса. О таком фокусе только что и узнал.
Наверное речь тут пойдет уже не о скорости, а о применимости такого метода. Одно дело заполнять уже существующую таблицу с готовым форматированием, и совсем другое - автоматически формировать новую таблицу вызовом метода ConvertToTable. А как же шрифт, выравнивание, границы и прочее ? После автоформирования таблицы еще и задавать необходимые свойства ячеек ? Накладно получится.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3745
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.06.18 08:19. Заголовок: В word есть такая фу..


В word есть такая функция: Преобразовать в таблицу. Это тот же метод ConvertToTable. только с заданием параметров в диалоге. Поиграйся с этой функцией, оцени, насколько она пригодна. На мой взгляд так не очень.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

В Ворде чутот помедленнее происходит, да и ещё не доделал...



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3746
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.06.18 16:40. Заголовок: Я в word обычно дела..


Я в word обычно делаю в бланке таблицу с одной (или несколькими) строками с уже готовым форматированием, а затем добавляю нужное мне количество строк вызовом метода InsertRowsBelow().

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5924
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.18 18:12. Заголовок: Сделал тест для Ворд..


Сделал тест для Ворда.
Таблица из 1000 строк.
HBOLE.LIB экспорт таблицы через буфер обмена одним шрифтом - 00:00:10  
HBOLE.LIB экспорт таблицы и перенос цветов и фонтов каждой ячейки - 00:40:44

Т.е. 40 минут требуется для того чтобы перенести цвета и фонты на таблицу из 1000 строк. Ужас сколько времени.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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 - это межпрограммное взаимодействие, а это самая медленная операция. Различия по скорости при выполнении в первом и втором случае думаю очевидны.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3752
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.06.18 15:55. Заголовок: Andrey пишет: Т.е. ..


Andrey пишет:

 цитата:
Т.е. 40 минут требуется для того чтобы перенести цвета и фонты на таблицу из 1000 строк. Ужас сколько времени.



Можно же эти действия делать не для каждой ячейки отдельно, а выделить некую область (например, колонку таблицы, одну или несколько), и устанавливать для нее соответствующие свойства. Или установить свойства по умолчанию для всей таблицы, а затем менять свойства только тех ячеек, если их значения отличны от значений по умолчанию. Значения же самих ячеек задавать через вставку из буфера обмена.


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5933
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.06.18 16:48. Заголовок: Pasha пишет: Малень..


Pasha пишет:

 цитата:
Маленький совет по оптимизации


Спасибо БОЛЬШОЕ !
Буду переделывать...

Pasha пишет:

 цитата:
Можно же эти действия делать не для каждой ячейки отдельно, а выделить некую область (например, колонку таблицы, одну или несколько)


Да я выкинул этот алгоритм из Ворда, оставил в качестве примера для Экселя - там это шустрей происходит.
И алгоритм переноса фонтов и цвета с таблицы Tsbrowse в Эксель и Ворд - делаю по блокам, т.е. по нескольким строкам.
Скорость просто возросла на порядок !
Желающие потом сами могут протестировать, когда пример будет готов.
Первая версия примера у Григория в библиотеке Tsb_Export.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() до получения объекта


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5936
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.07.18 21:48. Заголовок: Pasha пишет: Новые ..


Pasha пишет:

 цитата:
Новые версии Office (2013, 2016) - вещь непредсказуемая. Хотят - работают, не хотят - не работают.


А попробуй пожалуйста пример, который я высылал тебе.
Там выгрузка в Ворд - работает ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3755
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.07.18 21:55. Заголовок: Andrey пишет: А поп..


Andrey пишет:

 цитата:
А попробуй пожалуйста пример, который я высылал тебе.
Там выгрузка в Ворд - работает ?



Сейчас работает. Но не факт, что завтра будет работать. У меня тоже сейчас работает, а 10 дней назад та же функция на том же компьютере с тем же word не работала.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3756
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.07.18 22:03. Заголовок: SergKis пишет: Веро..


SergKis пишет:

 цитата:
Вероятно oActive == NIL не объект, который не успел сформироваться, передаться.
Попробуй сделать задержку inkeygui(100) \ DoMessageLoop() до получения объекта



Это конечно вариант. Но помню году так в 15-м я сломал голову с ошибками при выгрузке в Excel 2013 на одном ноуте. Выгрузка иногда выполнялась до конца, а чаще нет, причем ошибки возникали каждый раз разные при обращении к различным объектам. Никакой закономерности я тогда так и не увидел.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1457
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 03.07.18 22:10. Заголовок: SergKis пишет: Веро..


SergKis пишет:

 цитата:
Вероятно oActive == NIL не объект, который не успел сформироваться, передаться.
Попробуй сделать задержку inkeygui(100) \ DoMessageLoop() до получения объекта


Очень похоже, учитывая нестабильность ошибки. Нужна пауза.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6853
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.18 22:25. Заголовок: PSP пишет: Очень по..


PSP пишет:

 цитата:
Очень похоже, учитывая нестабильность ошибки. Нужна пауза.


При чем тут она ? Павел же пишет что при обращении к объектам.
Не ставить же паузу перед каждой строкой при обращении........

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Ну хоть одно решение есть !!!
Как пример закончу, то выложу для тестирования.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1458
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 03.07.18 22:41. Заголовок: Dima пишет: При чем..


Dima пишет:

 цитата:
При чем тут она ? Павел же пишет что при обращении к объектам.
Не ставить же паузу перед каждой строкой при обращении........


Ошибка непостоянна. Это значит, что объект создается, но "не всегда вовремя")
У Андрея задержка "сработала". Значит нужно учитывать эту особенность всегда.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1904
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.07.18 22:47. Заголовок: Dima пишет При чем т..


Dima пишет
 цитата:
При чем тут она ? Павел же пишет что при обращении к объектам.
Не ставить же паузу перед каждой строкой при обращении........


Там где формируется сторонний объект - придется ставить. проверка по valtype(...) != 'O'
Помнится в "лохматых" годах 200 мсек было мало, ставили наверняка 500 мсек

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6854
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.18 22:48. Заголовок: PSP пишет: Ошибка н..


PSP пишет:

 цитата:
Ошибка непостоянна. Это значит, что объект создается, но "не всегда вовремя")


ок

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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

то есть после создания документа удалось таки выполнить с ним несколько операций перед сваливанием

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3758
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.07.18 09:30. Заголовок: Подумалось вот, что ..


Подумалось вот, что сразу после oWord:Documents:Add()

oDoc := oWord:ActiveDocument
не отработал, а
oSel := oWord:Selection
отработал.
И операции с Selection затем выполнились, а как только было обращение к ActiveDocument, программа свалилась.
Это все наводит на грустные мысли. При таком асинхронном выполнении команд может быть все что угодно.
Скажем, после добавлении какого-нибудь объекта, например, таблицы, только что добавленная таблица может еще "не существовать",
и пойдут ошибки.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1910
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.07.18 20:15. Заголовок: Andrey пишет Согласе..


Andrey пишет
 цитата:
Согласен с этим, но на старых версиях всё работает. Эксель вообще пока без проблем


Сплюнь, а то появится антивирус (не даст экселю работать) и будет без разницы версия ... старая, новая ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5939
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.07.18 21:25. Заголовок: SergKis пишет: Сплю..


SergKis пишет:

 цитата:
Сплюнь, а то появится ....


Сплюнул....

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1914
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.07.18 21:31. Заголовок: Andrey Ты этим очен..


Andrey
Ты этим очень помог экселю


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3759
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.07.18 21:31. Заголовок: Andrey пишет: // ?..


Andrey пишет:

 цитата:
// ???? как здесь сделать ?



Так причина же непонятна, вот и ответа нет. По доке метод Add должен вернуть объект, а он возвращает непонятно что, и дальнейшие операции с "этим" приводят к ошибке. Есть рекомендация Сергея по задержке, может она поможет. Хотя у меня были похожие проблемы и с Excel, там в произвольных местах лезли непредсказуемые ошибки.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 на других компах.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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. Кстати такие типовые предупреждения появляются и в Ворде и Экселе, если версии созданных документов не совместимы.
Юзеру трудно объяснить, как с этим бороться. Хотелось что бы такие сообщения выводились на передний план экрана.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3764
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 06.07.18 14:37. Заголовок: Ээ. так есть же oExc..


Ээ. так есть же oExcel:DisplayAlerts, о котором здесь стотыщмильёнов раз говорилось

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6867
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.07.18 14:48. Заголовок: Pasha пишет: о кото..


Pasha пишет:

 цитата:
о котором здесь стотыщмильёнов раз говорилось


та даже больше ))

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5942
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.07.18 15:15. Заголовок: Pasha пишет: так ес..


Pasha пишет:

 цитата:
так есть же oExcel:DisplayAlerts, о котором здесь стотыщмильёнов раз говорилось



Забыл про это... СПАСИБО !



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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 и тому подобное.
Я не удивлюсь, если завтра все заработает безупречно.

И вопрос:
Подскажите пожалуйста почему так происходит и как исправить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 программа не по умолчанию.


Как программу эту доделаю (твою доработку тоже жду), то выложу для тестировки всем желающим.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() // сначала без этой строки потом с ней



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5963
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.07.18 20:16. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если исп. вместо


Да у меня не вылетает вообще... Нужно Павла просить, чтобы попробовал.

Pasha пишет:

 цитата:
И вопрос:
Подскажите пожалуйста почему так происходит и как исправить ?


Ну блин, нашли кого спрашивать... Для меня вообще это загадки ...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3775
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.07.18 20:43. Заголовок: Запустил тест десято..


Запустил тест десяток раз. Один раз отработал до конца, остальные попытки дают вылеты в самых разных местах: при обращении к Font, Size, Cells, Name, Value
Так что вряд ли такие изменения помогут. Не в одном, так в другом месте будет вылет.
Причина непонятна. Как я уже говорил, сталкиваюсь с таким поведением последних версий Office не первый раз.
Запустил свою программу, и прогнал различные варианты выгрузки в Excel. Вылет в некоторых случаях происходит, в некоторых нет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1462
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 14.07.18 21:07. Заголовок: Может не в тему, но ..


Может не в тему, но навеяло: вспомните, как винда10 удаляет файл. Даже маленький. Такое впечатление, что сначала она его куда-то отправляет, а потом уже удаляет. Может и со свежими офисами такая же петрушка?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6869
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.07.18 21:18. Заголовок: Pasha пишет: Вылет ..


Pasha пишет:

 цитата:
Вылет в некоторых случаях происходит, в некоторых нет.


Та же фигня , но в версии 2003 все норм

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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

На злополучном компе эксель при копировании стал выдавать ошибку:
"Рисунок слишком велик и будет усечен", и строки естественно не копируются. Хотя там копируется всего-то несколько десяток строк, и никакого рисунка не наблюдается.
Поиск в гугле находит массу аналогичных жалоб на подобную ошибку, и обычные шаманские рекомендации как ее преодолеть.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 53 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 49
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет