Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа в Delphi с шаблонами MS Word 
:(
    Опции темы
Delphist
  Дата 5.1.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Скажите, пожалуйста, как происходит работа с шаблонами MS Word с помощью Delphi. Т.е. есть подготовленный шаблон в MS Word'e, а в нужные поля этого шаблона должна пуступать информация из программы. если можно поделитесь информацией или примерами по данному вопросу.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Данкинг
Дата 5.1.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Конкретно с шаблоном не работал, но вот пример заполнения нужных полей в файле .doc:
Код

worduk:variant;
...
worduk:=createoleobject('word.application');
worduk.documents.open ('zakaz.doc');
worduk.visible:=false;
worduk.selection.find.text:='<zeus1>';
  if  worduk.selection.find.execute then worduk.selection.text:='Значение поля <zeus1>';
  worduk.selection.start:=0;
  worduk.selection.end:=worduk.activedocument.characters.count;
 worduk.selection.find.text:='<zeus2>';
  if  worduk.selection.find.execute then worduk.selection.text:='Значение поля <zeus2>';
  worduk.selection.start:=0;
  worduk.selection.end:=worduk.activedocument.characters.count;
worduk.activedocument.saveas ('zakaz.doc');
worduk.activedocument.close;
worduk.application.quit;
worduk:=unassigned;






--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Delphist
  Дата 6.1.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Данкинг @  5.1.2010,  18:41 Найти цитируемый пост)
Конкретно с шаблоном не работал, но вот пример заполнения нужных полей в файле .doc:

А как при этом должен выглядеть документ ворда, нужно ли там <zeus1>, <zeus2> обрамлять в тег var.
Просто хотелось бы увидеть пример, чтобы он показывал:
   1. как создать в *.dot  переменные (сейчас вычитал, что это так называемые bookmark'еры), чтобы в них попадала информация из нашей программы. как должен выглядеть наш код, который передавал бы конкретные значения в наши переменные заданные в *.dot
  2. в шаблоне помимо текста будет таблица динамическая, ее размер - число строк и колонок  должно формироваться из программы, возникает вопрос во-первых как программно сформировать такую таблицу и вывести ее в нужном месте.

Это сообщение отредактировал(а) Delphist - 6.1.2010, 10:50


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Regulum
Дата 7.1.2010, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 16.6.2009

Репутация: 1
Всего: 1



1. Вашу задачу в двух словах не решить. Ознакомьтесь с азами работы в MS Office из Delphi, например в книгах: 
    Корняков В.Н. Программирование документов и приложений MS Office в Delphi. - СПб.: БХВ-Петербург,2005.
    Архангельский А.Я. Приемы программирования в Delphi на основе VCL. - М.: БИНОМ, 2006

2. Непонятно, зачем использовать шаблоны, если текст документа формируется динамически из программы. Шаблоны целесообразно использовать в документах типа квитанций или платежек, где объем вставляемого программно текста намного меньше статического.
Вот простейший пример, от которого можно начинать плясать
Код

uses ComObj;
var
   W,Range,Table: Variant;
.....

//запускаем Word и создаем новый документ
   W:= CreateOleObject('Word.Application');
   W.Documents.Add;
//заголовок
   Range:= W.ActiveDocument.Range;
   Range.Font.Size:= 14;
   Range.Font.Name:= 'Times New Roman';
   Range.Font.Bold:= true;
   Range.ParagraphFormat.Alignment:= 1;  //по центру
   Range.InsertAfter('Заголовок моего любимого документа');
   Range.InsertAfter(Char(#13)); //переход на следующую строку
   Range.InsertAfter(Char(#13)); 
//вставляем таблицу 
   Range:= W.ActiveDocument.Range(Range.End-1,Range.End-1);
   W.ActiveDocument.Tables.Add(Range,2{количество строк},3{количество столбцов});
//настраиваем шапку таблицы
   Table:= W.ActiveDocument.Tables.Item(1);
   Table.Columns.Item(1).Width:= 20;  //ширина первой колонки
   Table.Cell(1,1).Range.Text:= '№';     //заголовок первой колонки
   Table.Columns.Item(2).Width:= 200;  //ширина второй колонки
   Table.Cell(1,2).Range.Text:= 'Ф.И.О.';//заголовок второй колонки
   ...
{обращение к остальным ячейкам таблицы аналогично - по номеру строки и столбца}
//выделим шапку таблицы (первая строка) жирным начертанием
   Table.Rows.Item(1).Range.Font.Bold:= true;
//и сделаем выравнивание текста по центру
   Table.Rows.Item(1).Range.ParagraphFormat.Alignment:= 1;
 

Вот, собственно, и почти все приемы, которые вам понадобятся. Подробнее о настройках есть в книгах
PM MAIL   Вверх
Regulum
Дата 7.1.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 16.6.2009

Репутация: 1
Всего: 1



Цитата(Delphist @ 6.1.2010,  09:47)
А как при этом должен выглядеть документ ворда, нужно ли там <zeus1>, <zeus2> обрамлять в тег var.

Никаких тегов в документе Word не нужно. Однако лучше каким-то образом выделять заменяемый текст, чтобы он наверняка не совпадал с другим фрагментом документа, который заменять не нужно. Ну например так: <текст, который надо заменить> или так ###текст, который надо заменить&.
Механизм вставки при этом такой: ищем фрагмент, который надо заменить и заменяем его полезной информацией. 
Простейшая реализация:
Код

uses ComObj;
var W: Variant;
....
W:= CreateOleObject('Word.Basic');
W.FileNew('C:\MpyShablon.dot'); //создаем документ по шаблону
W.StartOfDocument; //переходим в начало документа
W.EditFind('###текст, который надо заменить&'); //ищем то, что заменить
W.Insert('текст, который должен быть'); //и вставляем то, что надо
W.FileSaveAs('C:\MyFile.doc'); //сохраняем документ


PS. Прошу прощения, не нашел, как объединить 2 поста в один. Уважаемый модератор, не судите строго за 2 поста подряд.

Это сообщение отредактировал(а) Regulum - 7.1.2010, 09:43
PM MAIL   Вверх
Данкинг
Дата 7.1.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(Delphist @  6.1.2010,  09:47 Найти цитируемый пост)
А как при этом должен выглядеть документ ворда, нужно ли там <zeus1>, <zeus2> обрамлять в тег var.

Нет, просто я обрамляю тегами для удобства. А по факту - в моём примере реализуется просто поиск-замена слова.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
ZVano
Дата 14.1.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: нет
Всего: 4



Используем подстановочные ключи вида <#НазваниеПодстановки>
Используем компонент fWApp:TWordApplication;

0. Создаем функцию, которая должна вернуть значение тега по его имени "_TagText".
Код

function GetKeyValueByName(_TagText:string):string;
begin
  result := '$' + _TagText + '$';
end;


1. Настраиваем поиск. все переменные "_ИмяПеременной" типа OleVariant;
Код

      _FindText := '\<#*\>';// Искомый текст (Регулярное выражение :) )
      _MatchCase := False; // Регистрозависимый?
      _MatchWholeWord := False;
      _MatchWildcards := True;
      _MatchSoundsLike := False;
      _MatchAllWordForms := False;
      _Forward := True; //Вперед
      //_Wrap := wdFindContinue;//По достижению конца документа перейти в начало = бесконечный цикл
      _Wrap := wdFindStop;
      _Format := False;
      _ReplaceWith := '';
      _Replace := wdReplaceNone; // Способ замены (Не заменять|Все|Один)
      _MatchKashida := EmptyParam;
      _MatchDiacritics := EmptyParam;
      _MatchAlefHamza := EmptyParam;
      _MatchControl := EmptyParam;


2. Ищем и заменяем ключи
Код

      while fWApp.Selection.Find.Execute(
        _FindText, _MatchCase, _MatchWholeWord, _MatchWildcards, _MatchSoundsLike,
        _MatchAllWordForms, _Forward, _Wrap, _Format, _ReplaceWith, _Replace,
        _MatchKashida, _MatchDiacritics, _MatchAlefHamza, _MatchControl
      ) do
        begin
          vTagText :=  fWApp.Selection.Text; //Найденый текст выделен
          vTagPosBeg := fWApp.Selection.Range.Start;//Его начальная позиция(от начала документа)
          vTagPosEnd := fWApp.Selection.Range.End_;//Его конечная позиция(от начала документа)
          // Можно добавить информацию о найденом фрагменте в массив...
          //TagPosAdd(vTagText, vTagPosBeg, vTagPosEnd);
          //...но мы сразу подменяем текст
          fWApp.Selection.Text := GetKeyValueByName(vTagText);
        end;


PS: 
Лучше сохранять в массив объект fWApp.Selection.Range т.к. при изменении текста перед найденым фрагментом не нужно заботиться о смещении позиции.


Это сообщение отредактировал(а) ZVano - 12.2.2010, 12:08


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.