
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.26] |
![]() |
|
Сообщ.
#1
,
|
|
|
Необходимо программно вставить данные из программы в шаблон документа MS Word и распечатать результат, при этом шаблон оставить прежним. Как это сделать, используя компоненты WordApplication и WordDocument?
Пример: есть шаблон pattern.doc, содержащий текст: Фамилия: Имя: Нужно программно заполнить этот шаблон: Фамилия: Иванов Имя: Иван И распечатать. После чего закрыть файл шаблона без изменений. Открывать и писать в документы я научился. Печатать тоже, наверное, смогу. А как писать текст в ОПРЕДЕЛЕННЫЕ места документа? Самое первое что напрашивается, это сделать метки в шаблоне и осуществлять замену. Но метода вроде Replace ни где не нашел. Буду очень благодарен за советы и примеры. |
Сообщ.
#2
,
|
|
|
НА места куда надо вписать данные ставь таблички пустые, потом такой код
fil: OleVariant; wordApplication1.Connect; fil:='c:\Shablon_sotr.doc'; //WordApplication1.Documents.Add(EmptyParam,EmptyParam); WordApplication1.Documents.Open(fil,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); WordDocument1.ConnectTo(WordApplication1.ActiveDocument); WordApplication1.Options.CheckSpellingAsYouType:=false; WordApplication1.Options.CheckGrammarAsYouType:=false; WordDocument1.Tables.Item(1).Range.Text:= 'текст'; WordDocument1.Tables.Item(2).Range.Text:= 'текст'; WordDocument1.Tables.Item(3).Range.Text:= 'текст'; WordDocument1.Tables.Item(4).Range.Text:= 'текст'; только кто нить знает как потом закрыть всё это корректно, без вопросов и без провисания сервака в памяти? |
Сообщ.
#3
,
|
|
|
Для печати
WordDocument1.PrintOut; |
Сообщ.
#4
,
|
|
|
Спасибо!
А что если уже в самом шаблоне есть таблицы? У меня именно такая ситуация. Причем заносить данные нужно не просто в пустые ячейки, а в ячейки содержащие уж какой-то текст. Поэтому я сразу пытался избежать обращения к таблицам, шаблон большой и посчитать где какая таблица - практически невыполнимая задача для меня. |
Сообщ.
#5
,
|
|
|
Аналогичную задачу в Perl я всегда решал расстановкой меток в шаблоне, с последующей их заменой. Например:
Фамилия: %surname% Имя: %name% Затем используется простое регулярное выражение s/%surname%/Name/g, которое заменяет все метки %surname% на значение переменной Name. И т.д. Неужели ничего подобного нет в сервере MS Word? Я имею ввиду не регулярные выражения естественно, а замену текста на текст. Можете есть еще какие-то объекты, которые можно заменять на текст? |
Сообщ.
#6
,
|
|
|
Попробуй сделать так, на месте где тебе надо установить переменную, делаешь метку, например %name%, тоесть простой текст.
Потом выполняешь команду поиска и замены. Заменяешь на то что тебе надо. Посмотри на www.delphikingdom.ru, есть 2 статейки по word+delphi. |
Сообщ.
#7
,
|
|
|
В том-то и дело, что я ни где не могу найти инфу о том, как делать замену!
![]() ![]() Сейчас поищу на дельфикингдум... |
Сообщ.
#8
,
|
|
|
![]() ![]() text := AnsiReplaceText(text, '%surname%', surname); // or text := StringReplace(text, '%surname%', surname, [rfReplaceAll]); // or // ... // or написать свою замену |
Сообщ.
#9
,
|
|
|
ych_boriss, тут разговор о замене средствами VBS.
|
Сообщ.
#10
,
|
|
|
Всем кому интересно, приведенный ниже кусок открывает доковский файл FileName, находит первый текст %name% и заменяет его на 'Вася', распечатывает и закрывает файл без сохранения (распечатку еще не проверял):
procedure TForm1.APrintExecute(Sender: TObject); var FileName, wdDoNotSaveChanges: OleVariant; FindText, ReplaceText, OleFalse, OleTrue, Unknow: OleVariant; begin FileName := Directory + PatternFile; try WordApplication1.Connect; WordApplication1.Visible := True; try WordApplication1.Documents.Add(FileName, EmptyParam, EmptyParam, EmptyParam); FindText := '%name%'; ReplaceText := 'Вася'; OleFalse := False; OleTrue := True; Unknow := wdFindContinue; WordApplication1.Selection.Find.Execute(FindText, OleFalse, OleFalse, OleFalse, OleFalse, OleFalse, OleTrue, Unknow, OleFalse, ReplaceText, OleTrue, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordApplication1.PrintOut; WordApplication1.Quit(wdDoNotSaveChanges); WordApplication1.Disconnect; except ShowMessage('Не могу найти файл шаблона: ' + PatternFile) end; except ShowMessage('Не могу подключиться к серверу MS Word.') end; end; |
![]() |
Сообщ.
#11
,
|
|
![]() ![]() oldStr,newStr,replace:OleVariant; replace:=1; oldStr:='@1'; newStr:=DateTimeToStr(Now); //Находим в документе метки и производим их замены WordDocument1.Range.Find.Execute(oldStr,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,newStr,replace); |
Сообщ.
#13
,
|
|
|
Морока с этими док'ами...
Я для себя когда-то делал так. Шаблон сохранял в RTF и ставил че-то типа @001 в качестве метки. Во время формирования нового документа делал так: копировал посимвольно файл и если встречал "@" то читал следующие 3 символа, проганял полученное значение по кейсу и на выходе получал некоторую строку, которую и влепливал вместо @001 в новый файл. ПРЕИМУЩЕСТВА: RTF - кроссплатформенный формат не могут жить вирусы открывается Word'ом по умолчанию (в TOLEcontainer закинуть имя файла и сказать DoVerb(0)) может открываться другим текстовым редактором Исходный макет никогда не затрется ...короче, решайте сами... |