Автор | Сообщение |
|
| постоянный участник
|
Пост N: 97
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.06 17:15. Заголовок: 1.doc + 2.doc + 3.doc + 4.doc = all.doc
Кто может подсказать как объединить несколько WORD'овских файлов в один файл. И желательно чтоб в нем сделать "нумерацию страниц". Заранее спасибо за решение.
|
|
|
Ответов - 32
, стр:
1
2
All
[только новые]
|
|
|
| Администратор
|
Пост N: 404
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.11.06 09:53. Заголовок: Re:
oWord := TOleAuto():new('Word.Application') коллекция документов: oDocs := oWord:Documents открытие нового: oDocs:Open( cFile ) Переключение между документами oDoc := oDocs:Invoke('Item', nDoc) Выбор документа: oDoc:Select() Рабочая область: oSelect :- oWord:Selection Копировать все oSelect:WholeStory() oSelect:Copy() Вставить oSelect:Paste()
|
|
|
|
| постоянный участник
|
Пост N: 99
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.11.06 19:34. Заголовок: Re:
Паша, пожалуйста сделай тестовый пример полностью. Ну не все-же разбираются в этом. Взываю к твоему профессионализму, поделись чуток знаниями.
|
|
|
|
| Администратор
|
Пост N: 405
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.11.06 10:04. Заголовок: Re:
дык я вовсе не спец в этих визуальных васиках Сделал следующее Запустил ворд, включил запись макросов и вперед Открыл 3 файла, переключился на 2-й, ctrl-a, ctrl-c, на 1-й, ctrl-end, ctrl-v, на 3-й, ctrl-a, ctrl-c, на 1-й, ctrl-v Получилось: ' ' Макрос1 Макрос ' Макрос записан 22.11.2006 Паша ' Application.Move Left:=0, Top:=0 Documents.Open FileName:="avans.doc", ConfirmConversions:=False, ReadOnly _ :=False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate _ :="", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="" _ , Format:=wdOpenFormatAuto, XMLTransform:="" Documents.Open FileName:="Avans2.doc", ConfirmConversions:=False, ReadOnly _ :=False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate _ :="", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="" _ , Format:=wdOpenFormatAuto, XMLTransform:="" Application.Move Left:=0, Top:=0 Documents.Open FileName:="Kord.doc", ConfirmConversions:=False, ReadOnly:= _ False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ Format:=wdOpenFormatAuto, XMLTransform:="" Windows(2).Activate Selection.WholeStory Selection.Copy Windows(1).Activate Selection.EndKey Unit:=wdStory Windows(3).Activate Selection.WholeStory Selection.PasteAndFormat (wdPasteDefault) Selection.Copy Windows(1).Activate Selection.PasteAndFormat (wdPasteDefault) остается перевести эту фигню на харбор упростить открытие - достаточно просто open, и не в отдельном окне а в Documents переключаться не между окнами а между документами wdStory - это константа 6 вместо PasteAndFormat поставить просто Paste
|
|
|
|
| постоянный участник
|
Пост N: 102
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.11.06 23:58. Заголовок: Re:
Понятно. Пойдем по нарастающей .... А как на чистом xHarbour'e можно открыть Word'довский документ ? и далее записать под другим именем ? --------------------------------------------------------------- oWord := TOleAuto():new('Word.Application') коллекция документов: oDocs := oWord:Documents открытие нового: oDocs:Open( cFile ) --------------------------------------------------------------- Какую библиотеку используют вышеперечисленные операторы, и где примеры взять об них ?
|
|
|
|
| Администратор
|
Пост N: 406
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.11.06 12:01. Заголовок: Re:
цитата: | А как на чистом xHarbour'e можно открыть Word'довский документ ? и далее записать под другим именем ? |
| дык метод SaveAs цитата: | Какую библиотеку используют вышеперечисленные операторы, и где примеры взять об них ? |
| дык эти вопросы перетираются здесь уже много лет кратко повторяю надо взять хэлп от MS по васику: vbawd10.chm или vbxld10.chm там описаны все обьекты ворд-эксель, свойства и методы Например expression.SaveAs(FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter, Encoding, InsertLineBreaks, AllowSubstitutions, LineEnding, AddBiDiMarks) и далее описываются все параметры Как видно параметры ключевые, но для харбора надо их указывать как позиционные Далее. Как узнать что надо вызывать Сделать тоже самое в ворде, предварительно включив запись макросов. Затем остановить запись, посмотреть получившийся макрос. В хелпе уточнить что это за методы. Перевести с васика на харбор
|
|
|
|
| постоянный участник
|
Пост N: 109
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.11.06 18:12. Заголовок: Re:
Паша, ты меня не понял. Я спрашиваю кусок программы по открытию любого DOC файла на чистом xHarbour'e. FUNCTION MAIN() // Что здесь писать надо ? RETURN NIL И как ты переводишь "с васика на харбор" ? Поделись опытом.
|
|
|
|
| Администратор
|
Пост N: 408
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.11.06 10:02. Заголовок: Re:
открытие документа oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFile ) перевод с бэйсика заключается в замене точки на двоеточие, передаче параметров в скобках, замене ключевых параметров на позиционные, выбор элемента коллекции чарез [], пример: oRow := oRows[1] и учет других различий в синтаксисе языков
|
|
|
|
| Администратор
|
Пост N: 409
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.11.06 10:04. Заголовок: Re:
еще желательно указать oWord:Visible := .t. иначе окно ворд будет невидимо
|
|
|
|
| постоянный участник
|
Пост N: 117
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.11.06 01:49. Заголовок: Re:
/* Сделал пример, как и думал что чего-то не хватает. */ #include "common.ch" FUNCTION MAIN(cFile) LOCAL oWord, oDocs DEFAULT cFile TO "test.doc" oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFile ) oWord:Visible := .t. RETURN NIL /* Получаю: ++++++++++++++++++++ Internal Error Handling Information +++++++++++++++++++++ Subsystem Call ..: Word.Application:DOCUMENTS System Code .....: 16389 Default Status ..: False Description .....: E_FAIL Operation .......: OPEN Arguments .......: [ 1] = Type: C Val: test.doc Involved File ...: Dos Error Code ..: 0 Trace Through: ---------------- TOLEAUTO:OPEN : 0 in Module: win32ole.prg MAIN : 9 in Module: doc_word.prg ********************************************************************** 9 строка - oDocs:Open( cFile ) Как исправить ?
|
|
|
|
| Администратор
|
Пост N: 410
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.11.06 09:27. Заголовок: Re:
Дать имя файла с полным путем к нему
|
|
|
|
| постоянный участник
|
Пост N: 119
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.11.06 17:28. Заголовок: Re:
Да он лежит в текущем каталоге вместе с EXE-ником !
|
|
|
|
|
| Администратор
|
Пост N: 411
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.11.06 19:28. Заголовок: Re:
Твоя программа и ворд это две большие разницы Для ворда текущий каталог мои документы, про твой он ничего не знает А открывает файл имемнно ворд
|
|
|
|
| постоянный участник
|
Пост N: 120
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.12.06 04:20. Заголовок: Re:
Опять облом ..... Подскажите как делать дальше. #define CRLF CHR(13)+CHR(10) FUNCTION MAIN() LOCAL oWord, oDocs, nI, oText, oDoc, nDoc LOCAL aFileDoc := {"test1.doc","test2.doc","test3.doc","test4.doc"} LOCAL cFileDocAll := "All_test.doc" LOCAL cFile, cPathDoc := SUBSTR(EXENAME(), 1, RAT("\",EXENAME() ) ) FOR nI := 1 TO LEN(aFileDoc) cFile := cPathDoc + aFileDoc[nI] IF !FILE(cFile) ALERT("; Нет файла "+cFile+"; ",{"Пропускаю"} ) ELSE oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFile ) // Сделать окно WinWord видимым oWord:Visible := .t. ENDIF NEXT // Создать НОВЫЙ результирующий файл oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents:Add() oText := oWord:Selection() oText:Text := HB_OEMTOANSI("OLE на xHarbour") + CRLF oText:Font:Name := "Arial" oText:Font:Size := 48 oText:Font:Bold := .T. // не получается записать несколько строчек, остается только последняя oText:Text := HB_OEMTOANSI("проверка записи") + CRLF oText:Font:Name := "Arial" oText:Font:Size := 12 oText:Font:Bold := .F. // и потом выделение убрать нужно, а как ? cFile := cPathDoc + cFileDocAll oDocs:SaveAs( cFile ) // Сделать окно WinWord видимым oWord:Visible := .T. oWord:WindowState := 1 // Maximize // Далее нужно переключиться на 1 файл, скопировать в результирующий // нифига не получается ............. // ЗАКРЫТЬ ВСЕ ОКНА WORD'a FOR nI := 1 TO LEN(aFileDoc) NEXT RETURN NIL Паша еще пишет: упростить открытие - достаточно просто open, и не в отдельном окне а в Documents переключаться не между окнами а между документами wdStory - это константа 6 вместо PasteAndFormat поставить просто Paste Это для экономии памяти или для чего ?
|
|
|
|
| Администратор
|
Пост N: 412
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.12.06 10:35. Заголовок: Re:
Чтобы переключаться между документами, не надо 2-й раз запускать word, 1 раз oWord := TOleAuto():New( "Word.Application" ) я сделал этот пример через ворд: Selection.TypeText Text:="Пример оле" Selection.TypeParagraph Selection.Font.Bold = wdToggle Selection.TypeText Text:="Жирный" Selection.TypeParagraph Selection.Font.Bold = wdToggle Selection.TypeText Text:="обычный" т.е для новой строки можно вызвать метод TypeParagraph а wdToggle это #define wdToggle 9999998 закрыть все документы: for each oDoc in oDocs oDoc:Close() next
|
|
|
|
| постоянный участник
|
Пост N: 124
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 00:31. Заголовок: Re:
Pasha пишет: цитата: | т.е для новой строки можно вызвать метод TypeParagraph закрыть все документы: for each oDoc in oDocs oDoc:Close() next |
| НИФИГА не могу перевести с васика на харбор !!! Помогите исправить в исходнике: #define CRLF CHR(13)+CHR(10) FUNCTION MAIN() LOCAL oWord, oDocs, nI, oText, oDoc, nDoc LOCAL aFileDoc := {"test1.doc","test2.doc","test3.doc","test4.doc"} LOCAL cFileDocAll := "All_test.doc" LOCAL cFile, cPathDoc := SUBSTR(EXENAME(), 1, RAT("\",EXENAME() ) ) oWord := TOleAuto():New( "Word.Application" ) FOR nI := 1 TO LEN(aFileDoc) cFile := cPathDoc + aFileDoc[nI] IF !FILE(cFile) ALERT("; Нет файла "+cFile+"; ",{"Пропускаю"} ) ELSE oDocs := oWord:Documents oDocs:Open( cFile ) ENDIF NEXT // Создать НОВЫЙ результирующий файл oDocs := oWord:Documents:Add() oText := oWord:Selection() oText:Text := HB_OEMTOANSI("OLE на xHarbour") + CRLF oText:Font:Name := "Arial" oText:Font:Size := 48 oText:Font:Bold := .T. ******* т.е для новой строки можно вызвать метод TypeParagraph ************************* НЕРАБОТАЕТ !!!! ********************* oText:Text:Paragraph ********************* oText:TypeParagraph ********************* oText:Type:Paragraph // не получается записать несколько строчек, остается только последняя oText:Text := HB_OEMTOANSI("проверка записи") + CRLF oText:Font:Name := "Arial" oText:Font:Size := 12 oText:Font:Bold := .F. // и потом выделение убрать нужно, а как ? cFile := cPathDoc + cFileDocAll oDocs:SaveAs( cFile ) // Сохранить файл как ..... oWord:Visible := .T. // Сделать окно WinWord видимым oWord:WindowState := 1 // Maximize // Далее нужно переключиться на 1 файл, скопировать в результирующий // нифига не получается ............. wait // ЗАКРЫТЬ ВСЕ ОКНА WORD'a ****************************** НЕРАБОТАЕТ !!!!! FOR each oDoc in oDocs oDoc:Close() NEXT /* Error Word.Application:DOCUMENTS:ADD/3 DISP_E_MEMBERNOTFOUND: OLENEWENUMERATOR Arguments: () Error at ...: TOLEAUTO:OLENEWENUMERATOR(0) in Module: win32ole.prg Called from : TOLEAUTO:__OPFOREACH(707) in Module: win32ole.prg Called from : MAIN(58) in Module: DOC_WORD.prg */ RETURN NIL
|
|
|
|
| постоянный участник
|
Пост N: 50
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.06 05:31. Заголовок: Re:
#define CRLF CHR(13)+CHR(10) FUNCTION MAIN() LOCAL oWord, oDocs, nI, oText, oDoc, nDoc LOCAL aFileDoc := {"test1.doc","test2.doc","test3.doc","test4.doc"} LOCAL cFileDocAll := "All_test.doc" LOCAL cFile, cPathDoc := SUBSTR(EXENAME(), 1, RAT("\",EXENAME() ) ) TRY oWord := GetActiveObject( "Word.Application" ) CATCH TRY oWord := CreateObject( "Word.Application" ) CATCH Alert( "ОШИБКА! Word не доступен. [" + Ole2TxtError()+ "]" ) RETURN END END FOR nI := 1 TO LEN(aFileDoc) cFile := cPathDoc + aFileDoc[nI] IF !FILE(cFile) ALERT("; Нет файла "+cFile+"; ",{"Пропускаю"} ) ELSE oDocs := oWord:Documents oDocs:Open( cFile ) ENDIF NEXT oDocs := oWord:Documents:Add() oText := oWord:Selection() oText:Font:Name := "Arial" oText:Font:Size := 48 oText:Font:Bold := .T. oText:TypeText ( HB_OEMTOANSI("OLE на xHarbour") + CRLF ) oText:TypeParagraph() /// !!! oText:TypeText ( HB_OEMTOANSI("проверка записи 1") + CRLF ) oText:TypeParagraph() // обратите внимание будет ли сл.строка в результирующем файле oText:Text := HB_OEMTOANSI("проверка записи 2") + CRLF oText:Font:Name := "Arial" oText:Font:Size := 12 oText:Font:Bold := .F. cFile := cPathDoc + cFileDocAll oDocs:SaveAs( cFile ) // Сохранить файл как ..... oWord:Visible := .T. // Сделать окно WinWord видимым oWord:WindowState := 1 // Maximize oWord:Windows[2]:Activate() oText := oWord:Selection() ; oText:WholeStory() ; oText:Copy() oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) oWord:Windows[3]:Activate() oText := oWord:Selection() ; oText:WholeStory() ; oText:Copy() oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) oWord:Windows[4]:Activate() oText := oWord:Selection() ; oText:WholeStory() ; oText:Copy() oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) oWord:Windows[5]:Activate() oText := oWord:Selection() ; oText:WholeStory() ; oText:Copy() oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) oDocs:Save() // если нужно конечно wait oDocs := oWord:Documents // !!! FOR each oDoc in oDocs oDoc:Close() NEXT oWord:Quit() // если конечно надо
|
|
|
|
| постоянный участник
|
Пост N: 125
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 11:06. Заголовок: Re:
Спасибо большое, Петр !!! Пошел разбираться.
|
|
|
|
| постоянный участник
|
Пост N: 132
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 22:00. Заголовок: Re:
Заработало !!! Спасибо Петр ! А можно еще бы чтоб копировало в цикле ? Т.е. сколько файлов открываешь, столько и копирует. Просто не совсем понятен принцип нумерации окон: oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) Т.е. на 1-окно копируется содержимое буфера, а почему оно первое, ведь результирующий файл открывался последним ? И как получить хендл окна, т.е. какой номер у какого файла ? И как закрыть все файлы, кроме результирующего ?
|
|
|
|
| постоянный участник
|
Пост N: 55
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.12.06 14:00. Заголовок: Re:
Andrey пишет: цитата: | А можно еще бы чтоб копировало в цикле ? Т.е. сколько файлов открываешь, столько и копирует. |
| Можно Andrey пишет: цитата: | Т.е. на 1-окно копируется содержимое буфера, а почему оно первое, ведь результирующий файл открывался последним ? |
| Откройте Word и откройте в нем несколько файлов - посмотрите в меню Окно список открытых окон - сразу все поймете: в 1 окне - открыт последний файл, в последнем - первый. Andrey пишет: цитата: | И как получить хендл окна, т.е. какой номер у какого файла ? |
| Наверное как-то можно, не интересовался Andrey пишет: цитата: | И как закрыть все файлы, кроме результирующего ? |
| В данном случае лучше сохранить результирующий файл, закрыть все файлы и повторно открыть результирующий файл. #define CRLF CHR(13)+CHR(10) FUNCTION MAIN() LOCAL oWord, oDocs, nI, oText, oDoc, nDoc LOCAL aFileDoc := {"test1.doc","test2.doc","test3.doc","test4.doc"} LOCAL cFileDocAll := "All_test.doc" LOCAL cFile, cPathDoc := SUBSTR(EXENAME(), 1, RAT("\",EXENAME() ) ) TRY oWord := GetActiveObject( "Word.Application" ) CATCH TRY oWord := CreateObject( "Word.Application" ) CATCH Alert( "ОШИБКА! Word не доступен. [" + Ole2TxtError()+ "]" ) RETURN END END FOR nI := 1 TO LEN( aFileDoc ) cFile := cPathDoc + aFileDoc[nI] IF !FILE(cFile) ALERT("; Нет файла "+cFile+"; ",{"Пропускаю"} ) ELSE oDocs := oWord:Documents oDocs:Open( cFile ) ENDIF NEXT oDocs := oWord:Documents:Add() oText := oWord:Selection() oText:Font:Name := "Arial" oText:Font:Size := 48 oText:Font:Bold := .T. oText:TypeText ( HB_OEMTOANSI("OLE на xHarbour") + CRLF ) oText:TypeParagraph() /// !!! oText:TypeText ( HB_OEMTOANSI("проверка записи") + CRLF ) oText:TypeParagraph() cFile := cPathDoc + cFileDocAll oDocs:SaveAs( cFile ) // Сохранить файл как ..... FOR nI := 2 TO LEN(aFileDoc)+1 oWord:Windows[nI]:Activate() oText := oWord:Selection() ; oText:WholeStory() ; oText:Copy() oWord:Windows[1]:Activate() oText := oWord:Selection() ; oText:PasteAndFormat( 0 ) NEXT oDocs:Save() //сохраняем all_test oDocs := oWord:Documents FOR each oDoc in oDocs oDoc:Close() //закрываем все NEXT oDocs:Open( cFile ) // открываем all_test oWord:Visible := .T. oWord:WindowState := 1 wait oWord:Quit()
|
|
|
|
| постоянный участник
|
Пост N: 137
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.12.06 01:52. Заголовок: Re:
Спасибо Петр, что бы я делал без тебя ! Подскажи, еще такой момент. Если doc файлы различаются оформлением (поля и ориентацией), то при копировании в один файл тоже теряется оформление, т.е. 1-файл книжная оринт., 2-альбомная, 3-альбомная, 4-альбамная. Результирующий файл - книжный. Как сохранить ориентацию у страниц. И еще вопрос, как отправить файл на печать и задать кол-во копий ?
|
|
|
Ответов - 32
, стр:
1
2
All
[только новые]
|
|