Связь с администрацией сайта:       

demo

Среди толпы я одинок

Delphi 7 Вывод данных в MS Word

Очень часто программисты задаются вопросом – «Как же вывести данные из программы в MS Word?» как только они доходят до вывода отчетов. 99% людей используют стандартные компоненты, которые ужасны в использовании и на написание вывода информации уходит очень много времени. Я научу вас как легко и непринужденно это сделать, добавив пару функций, написанных мной, и создать сам файл в MS Word. Ведь намного удобнее и проще использовать готовый шаблон, сделанный самим, нежели всё делать из программы, не так ли? Особенно для вывода прайс-листов, договоров и тому подобные документы. Для вывода отчетов лучше использовать MS Excel. Если интересует, то статья на эту тему тоже есть. Также необходимо будет добавить пару функций.
 
Вернемся к выводу в Word. Пойдем по порядку.

Не забываем, что для каждой формы, где будет вывод данных, необходимо проделывать все эти действия. Если, конечно, вы порядочный программист, то можете сделать библиотеку или класс. Всё на ваше усмотрение. На всякий случай опишу подробнее, куда и что прописывать.

Откройте код вашей формы и начнем.
В блоке «interface»->«uses» подключите модули WordXP,ActiveX,ComObj.
В блоке «interface»->««type» опишите будущую процедуру - procedure repl(stroke:string;rpl:string);
В блоке «interface»->««public»  добавляем переменную - MSWord:variant;
В блоке «implementation»-> после «{$R *.dfm}» вставляем процедуру:

Заметим, что TF_MAin – это мой идентификатор формы. У вас этот параметр будет отличаться. Его можно посмотреть в «interface»->«type» первой строкой TF_MAin = class(TForm).

 
procedure TF_MAin.repl(stroke:string;rpl:string);
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var   pth,fnn:string;
begin
 msword.Selection.Find.ClearFormatting;
        msword.Selection.Find.Text:=stroke;
        msword.Selection.Find.Replacement.Text:=rpl;
        msword.Selection.Find.Forward:=True;
        msword.Selection.Find.Wrap:=wdFindContinue;
        msword.Selection.Find.Format:=False;
        msword.Selection.Find.MatchCase:=False;
        msword.Selection.Find.MatchWholeWord:=False;
        msword.Selection.Find.MatchWildcards:=False;
        msword.Selection.Find.MatchSoundsLike:=False;
        msword.Selection.Find.MatchAllWordForms:=False;
        msword.Selection.Find.Execute(Replace:=wdReplaceAll);
end;
 
В чем заключается смысл этой процедуры. Он находит слова-идентификаторы и заменяет их.

Не забываем, что в файле необходимо расставить эти слова в формате {%VasheSlovo%}. Только на английском и именно в таких скобках. Чтобы он случайно не заменил другой текст. На самом деле вы можете заменять любые слова, только порой это будет чревато. А так уж точно не замените другой текст.

И так, перейдем к использованию данной функции.
Не забудьте, что необходимо предварительно создать файл Word. Я создал файл «NameDoc.doc» в папке «report» и внутри файла написал {%DATE%}, дабы заменить его на сегодняшнюю дату.
Procedure TF_MAin.N28Click(Sender: TObject); // В моем случае это нажатие на кнопку в меню
//Подключаем необходимые константы для работы
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var pth:string;
begin
//Сам код для вывода данных
 MSWord:=CreateOLEObject('Word.Application');
  pth:=ExtractFilePath(ParamStr(0));
 try
  MSWord.Documents.Open(FileName:= pth+'report\NameDoc.doc',readonly:=True);
 repl('{%DATE%}',DateToStr(Now)); //Используем нашу 
//процедуру repl и заменяем текст {%DATE%} на сегодняшнюю дату.
finally Msword.visible:=true; msword:=unassigned; end; end;
Вобщем-то, ивсё. Очень подходит для вывода договоров предприятия. Согласитесь, что проще взять готовый договор и где необходимо подставить изменяемые значения, к примеру - Итого: {%SUMMA%} руб.  Дата: {%DATE%}, нежели мучиться и подгонять данные из программы.

Замечу, что все стили сохраняются, то есть {%SUMMA%} при замене будет жирным подчеркнутым курсивом.

Перейдем к более сложному примеру – использование таблиц в нашем шаблоне.
Я создал вот такую табличку в файле:

Тип механизма

Изделие

Страна производитель

Фирма

Материал

Стоимость*

 

 

 

 

 

 

 

 

 

 

 

 

Используем прошлую процедуру на кнопке.

Отмечу, что моя таблица на Datamodule(F_DM) называется tbl_stoimost_detaley

procedure TF_MAin.N28Click(Sender: TObject);
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var
  pth:string;
  varcol: OleVariant;
begin
  j := 2; //Ставим номер текущей строки в таблице
  MSWord:=CreateOLEObject('Word.Application');
  pth:=ExtractFilePath(ParamStr(0));
 try
  MSWord.Documents.Open(FileName:= pth+'report\NameDoc.doc',readonly:=True);
  j:=2;
  t:=0;
  k:=1;
  t:=F_DM.tbl_stoimost_detaley.RecordCount; //Количество записей в базе
  F_DM.tbl_stoimost_detaley.First; //Переводим на первую запись
 while not F_DM.tbl_stoimost_detaley.Eof do //Выводим из базы данные в таблицу
 begin
MSWord.ActiveDocument.Tables.Item(1).Cell(j,1).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Тип механизма').AsString;
MSWord.ActiveDocument.Tables.Item(1).Cell(j,2).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Изделие').AsString;
MSWord.ActiveDocument.Tables.Item(1).Cell(j,3).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Страна производитель').AsString;
MSWord.ActiveDocument.Tables.Item(1).Cell(j,4).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Фирма').AsString;
MSWord.ActiveDocument.Tables.Item(1).Cell(j,5).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Материал').AsString;
MSWord.ActiveDocument.Tables.Item(1).Cell(j,6).Range.Text:=F_DM.tbl_stoimost_detaley.Fieldbyname('Стоимость').AsString+' руб.';
     F_DM.tbl_stoimost_detaley.Next; //Следующая запись
     k:=k+1;
     if k<=t then //Проверяем, чтобы 
//количество строк не превышало количество записей в базе.
//Без условия он добавит лишнюю пустую строку.
begin varcol:=MSWord.ActiveDocument.Tables.Item(1).Rows.Item(j+1); MSWord.ActiveDocument.Tables.Item(1).Rows.Add(varcol); end; j:=j+1; end; finally Msword.visible:=true; msword:=unassigned; end; end;
Вкратце, в процедуре основными строками будут:
MSWord.ActiveDocument.Tables.Item(1).Cell(j,1).Range.Text, где Item(1) номер таблицы, Cell(j,1), где j - номер строки, 1 – номер столбца.
varcol:=MSWord.ActiveDocument.Tables.Item(1).Rows.Item(j+1); //Добавляем в переменную количество строк
MSWord.ActiveDocument.Tables.Item(1).Rows.Add(varcol); //Добавляем новую строку в таблицу
 
На этом всё. Больше ничего не требуется для вывода данных в Word. На вид кажется сложным, но при использовании данного метода вы сократите себе время при написании программного кода.
 
 
Голосуй
(2 Голоса)
Оставьте комментарий

Поля, отмеченные звездочкой(*) обязательны для заполнения. HTML теги не приветствуются.

Вход на сайт