На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Заполнение и печать шаблона MS Word , Как это делается?
    Необходимо программно вставить данные из программы в шаблон документа MS Word и распечатать результат, при этом шаблон оставить прежним. Как это сделать, используя компоненты WordApplication и WordDocument?

    Пример: есть шаблон pattern.doc, содержащий текст:
    Фамилия:
    Имя:

    Нужно программно заполнить этот шаблон:
    Фамилия: Иванов
    Имя: Иван

    И распечатать. После чего закрыть файл шаблона без изменений.

    Открывать и писать в документы я научился. Печатать тоже, наверное, смогу. А как писать текст в ОПРЕДЕЛЕННЫЕ места документа? Самое первое что напрашивается, это сделать метки в шаблоне и осуществлять замену. Но метода вроде Replace ни где не нашел.

    Буду очень благодарен за советы и примеры.
      НА места куда надо вписать данные ставь таблички пустые, потом такой код

      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:= 'текст';



      только кто нить знает как потом закрыть всё это корректно, без вопросов и без провисания сервака в памяти?
        Для печати
        WordDocument1.PrintOut;
          Спасибо!

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

            Фамилия: %surname%
            Имя: %name%

            Затем используется простое регулярное выражение s/%surname%/Name/g, которое заменяет все метки %surname% на значение переменной Name. И т.д.

            Неужели ничего подобного нет в сервере MS Word? Я имею ввиду не регулярные выражения естественно, а замену текста на текст. Можете есть еще какие-то объекты, которые можно заменять на текст?
              Попробуй сделать так, на месте где тебе надо установить переменную, делаешь метку, например %name%, тоесть простой текст.
              Потом выполняешь команду поиска и замены. Заменяешь на то что тебе надо.
              Посмотри на www.delphikingdom.ru, есть 2 статейки по word+delphi.
                В том-то и дело, что я ни где не могу найти инфу о том, как делать замену! :) Куча доков и книг по работе с Word из Delphi и ни где нет и слова о замене! :)

                Сейчас поищу на дельфикингдум...
                  ExpandedWrap disabled
                     
                    text := AnsiReplaceText(text, '%surname%', surname); // or
                    text := StringReplace(text, '%surname%', surname, [rfReplaceAll]); // or
                    // ...
                    // or написать свою замену
                  Сообщение отредактировано: ych_boriss -
                    ych_boriss, тут разговор о замене средствами VBS.
                      Всем кому интересно, приведенный ниже кусок открывает доковский файл 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;
                        ExpandedWrap disabled
                            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);
                            Морока с этими док'ами...
                            Я для себя когда-то делал так.
                            Шаблон сохранял в RTF и ставил че-то типа @001 в качестве метки.
                            Во время формирования нового документа делал так: копировал посимвольно файл и если встречал "@" то читал следующие 3 символа, проганял полученное значение по кейсу и на выходе получал некоторую строку, которую и влепливал вместо @001 в новый файл.
                            ПРЕИМУЩЕСТВА:
                            RTF - кроссплатформенный формат
                            не могут жить вирусы
                            открывается Word'ом по умолчанию (в TOLEcontainer закинуть имя файла и сказать DoVerb(0))
                            может открываться другим текстовым редактором
                            Исходный макет никогда не затрется
                            ...короче, решайте сами...
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0342 ]   [ 16 queries used ]   [ Generated: 2.08.25, 03:07 GMT ]