Форум » [x]Harbour » шаблон Microsoft Word » Ответить

шаблон Microsoft Word

Новичок: Кто подскажет (и покажет) - требуется использовать шаблон Word (взаимодействие - подготовка, открытие, передача параметров и т.д.), то есть требуется подготовить определенный шаблон Word, передать параметры с программы, сохранить в формате docx в определенном месте или направить на печать.

Ответов - 103, стр: 1 2 3 4 5 6 All

Dima: Вероятно все действия проделать в WORD с записью в макрос а затем пробовать все повторить в Harbour используя текст макроса.

Новичок: спс но... данный вариант я итак использую... - то есть я в программе создаю весь документ Word, а при изменении текста в Word, соответственно приходится изменять исходный код в программе. - хотелось бы использовать шаблон Word, чтобы при изменении текста в документе - пользователям и мне достаточно было изменить этот шаблон не изменяя исходный код программы И во-вторых, в дальнейшем мне было бы достаточно предоставить =Справочник выходных переменных=, с помощью которого пользователи могли бы создавать свои любые отчеты, документы - просто создав шаблон, указав переменные и установив в определенную директорию моей программы.

Dima: Так сразу и храни эти переменные в шаблоне. Затем его грузим , поиск и замена переменных по тексту из справочника. И все. Например шаблон: Директор [value1] Бухгалтер [blabla] В справочнике есть value1 и есть на что ее заменять , как и blabla.


SadStar3333: если я правильно понял проблему то возможно подойдет мое решение (о котором я уже здесь упоминал) 1. Нужные места в документе ворд помечаю именами. В 2003-м - Меню/Вставка/Закладка 2. в программе делаю так [pre2] .... aAdd(aBookMarks, {"Team", s}) aAdd(aBookMarks, {"Sign3", wMain.txt_Manager3.Value}) aAdd(aBookMarks, {"Sign4", wMain.txt_Manager4.Value}) aAdd(aBookMarks, {"Sign2", wMain.txt_Manager2.Value}) If oResDoc:Bookmarks:Count > 0 BkMrk:="" For Each BkMrk In oResDoc:Bookmarks bmName:=BkMrk:Name if (n:=AScan( aBookMarks, {|x| x[ 1 ] == bmName} ))>0 //BkMrk:Range := BkMrk:Name BkMrk:Range := aBookMarks[n,2] endif Next //BkMrk EndIf [/pre2]

Dima: SadStar3333 пишет: то возможно подойдет мое решение Да тоже нормальный вариант !

Andrey: Думал что не буду пользоваться таблицами Ворда. А не получилось, нужно делать.... Подскажите решение (может кто поделиться функциями) как сделать из шаблона таблицы Ворда: как найти в тексте таблицу, как сделать добавление столбца и вставку данных из базы ? Хочу использовать простой шаблон, типа:

Pasha: Если поставить закладку внутри таблицы, то найти ее можно так: oSelect:Goto(-1,,, <BookmarkName>) Вставить столбец в таблицу в указанном месте можно вызовами методов: oSelect:InsertColumns() или oSelect:InsertColumnsRight() Вставить текст: oSelect:TypeText(<text>) Перемещение между ячейками таблицы: oSelect:MoveRight(1, 1) аналогично есть методы MoveLeft, MoveUp, MoveDown, и еще несколько Move*

Andrey: Pasha пишет: Если поставить закладку внутри таблицы, то найти ее можно так: Спасибо БОЛЬШОЕ !

Andrey: Всем привет ! Вопрос возник по ходу решения поиск/замена выражения в Ворде. Не хочу делать закладку, уже имел печальный опыт, юзера при правке шаблона стирают закладки. Если будет стоять текст другого цвета (у меня в шаблоне синий) то они этот текст не трогают. Сделал макрос поиск/замена всех строк:[pre2] Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "#M->Date1" .Replacement.Text = "01/01/2016" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll[/pre2] Как его перевести на Харбор ? Помогите пожалуйста, уже лет 5 не занимался этим.

Pasha: Вместо точки ставить двоеточие После вызова метода ставить скобки Так: oFind := oSelec:Find oFind:ClearFormatting() oFind:Replacement:ClearFormatting() oFind:Text := "#M->Date1" oFind:Replacement:Text := "01/01/2016" oFind:Forward := .T. oFind:Wrap := 1 и так далее в конце oFind:Execute(,,,,,,,,,, 2) справку по методам смотреть в файле VBAWD10.CHM Из этого файла: Runs the specified find operation. Returns True if the find operation is successful. Boolean. expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl) видно, что Replace - это 11-й параметр метода Execute. В таком порядке и надо передавать значения ну и подставлять значения констант wd* поправил опечатки

Andrey: Pasha СПАСИБО БОЛЬШОЕ !!! Пошёл делать...

Andrey: Сразу большая непонятка. Открываю Ворд так: [pre2] oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFileDoc ) oActive := oWord:ActiveDocument oSelect := oWord:Selection [/pre2] oFind: нужно менять на что ? Не пойму где здесь работа с oFind И ещё вопрос, если есть #include "word.ch" можно же не менять значения констант wd* ?

Dima: Andrey Попробуй вариант с созданием таблицы в EXCEL и после просто скопируй ее и вставь в WORD , должно сработать , да и гимора меньше мне кажется. PS Проверил в рукопашную , работает на ура

Andrey: Dima пишет: Попробуй вариант с созданием таблицы в EXCEL и после просто скопируй ее и вставь в WORD , должно сработать , да и гимора меньше мне кажется. Не пойдёт. Нужно пример сделать для учёбы. Чтобы потом любой желающий к себе в прогу забирал. Пример работы с EXCEL я сделал ( с вашей помощью). Теперь нужно так же с Вордом сделать. У меня есть вставка/замена через rtf файл, есть с закладками. Но это не то. Этот пример гибче будет. Да и работы с таблицами в Ворде так и не нашёл нигде. Будем биться с Вордом !

Dima: Andrey пишет: Будем биться с Вордом ! Удачи !

Andrey: Вот здесь есть похожее решение. http://clipper.borda.ru/?1-4-0-00001048-000-0-0-1426699788 С помощью Паши и Haz - поиск/замена заработала !

Andrey: Как получить хендл открытого Вордом окна ? Для Экселя знаю как получить: [pre2] // окно таблицы Excel на передний план hWnd := oExcel:hWnd ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd ) [/pre2] Для Ворда не срабатывает... hWnd := oWord:hWnd Выдаёт ошибку: Error Word.Application/0 S_OK: HWND</p> Called from TOLEAUTO:HWND(0) Called from MYWORD2OLE(56)

Петр: Если для Excel expression .Hwnd expression A variable that represents an Application object. то в Word expression .Hwnd expression A variable that represents a Window object. Поэтому, должно сработать что-то типа hWnd := oWord:ActiveDocument:ActiveWindow:Hwnd или oWord:Windows("Document1"):Hwnd ShowWindow( hWnd, 3 ).. можно заменить на :Windows("Document1"):Activate :Windows("Document1"):WindowState := wdWindowStateMaximize

Andrey: Петр пишет: oWord:Windows("Document1"):Hwnd Не работает ! Причём у меня Русский MS Word и всегда создаётся "Документ2", у юзеров тоже может быть по другому. Вот и не хочется делать перебор разных вариантов: [pre2] cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) hWnd2 := FindWindowEx(,,, cTitle2 ) [/pre2] А получить хенд созданного ворд-документа: oWord:Documents:Add() oActive := oWord:ActiveDocument() oMarks := oActive:BookMarks oText := oWord:Selection() Как это сделать ?

Петр: Andrey пишет: Не работает ! Да, действительно, хотя по документации должно бы работать. Andrey пишет: А получить хенд созданного ворд-документа: oWord:Documents:Add() oActive := oWord:ActiveDocument() Пробуйте так oWord:Documents:Add() oActive := oWord:ActiveDocument() cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle )



полная версия страницы