Создание отчета в MS Word

Создание отчета в MS Word
Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет "глюки"), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны зеленым цветом, реально они конечно не видны):
Создание отчета в MS Word(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:
var MsWord : variant;
MsWord := CreateOleObject('Word.Basic'); Для Delphi 3, пример ниже)
Накладная ? Num 
 
?
 
Поставщик
 
Наименование товара
 
Код товара
 
Кол-во
 
Цена
 
Сумма
Table
 
 
 
 
 
 
 
Сдал_______________________          Принял________________________
             М.П.                                    М.П.
 
 
 
Далее в форму, откуда будут выводиться данные, вставляете компоненту DdeClientConv из палитры System. Назовем ее DDE1. Эта компонента позволяет передавать информацию между программами методом DDE. Свойства:
ConnectMode : ddeManual - связь устанавливаем вручную
DdeService : (winword) - с кем устанавливается связь
ServiceApplication : C:\MSOffice\Winword\WINWORD.EXE - полный путь доступа к программе. (Вот здесь можно наступить на грабли. Ведь Word может лежать в любой папке! Поэтому путь доступа к нему лучше взять из реестра, а еще лучше использовать OLE см.начало раздела)
 
Теперь пишем процедуру передачи данных:
 
 
{ Печать накладной }
procedure Form1.PrintN;
Var
    S          : string;
    i          : integer;
    Sum        : double;  {итоговая сумма, кстати,совет: не пользуйтесь типом real!}
    Tv, Ss     : PChar;
begin
 S:=GetCurrentDir+'\Накладная.doc'; { имя открываемого документа }
 DDE1.OpenLink; { устанавливаем связь }
 Tv:=StrAlloc(20000); Ss:=StrAlloc(300); { выделяем память }
  { даем команду открыть документ и установить курсор в начало документа }
 StrPCopy(Tv, '[FileOpen "'+S+'"][StartOfDocument]');
 S:=NNakl.Text; { номер накладной }
  { записываем в позицию Num номер накладной }
 StrCat(Tv, StrPCopy(SS, '[EditBookmark .Name = "Num", .Goto][Insert "'+S+'"]'+
 '[EditBookmark .Name = "Table", .Goto]'); { и переходим к заполнению таблицы }
  { передаем данные в Word }
 if not DDE1.ExecuteMacro(Tv, false) then 
   begin { сообщаем об ошибке и выход }
    MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0); 
    StrDispose(Tv); StrDispose(Ss);
    exit;
   end;
  { Заполняем таблицу }
 Sum:=0; Nn:=0;
 for i:=0 to TCount do
 begin
  inc(Nn);
  { предполагаем, что данные находятся в массиве T }
  StrPCopy(Tv, '[Insert "'+IntToStr(Nn)+'"][NextCell][Insert "'+T[i].Company+'"]'+
   '[NextCell][Insert "'+T.TName+'"][NextCell][Insert "'+T.Cod+'"][NextCell]'+
   '[Insert "'+IntToStr(T.Count)+'"][NextCell]'+
   '[Insert "'+FloatToStr(T.Cena)+'"][NextCell]'+
   '[Insert "'+FloatToStr(T.Count*T.Cena)*+'"][NextCell]'));
  inc(Nn);
  Sum:=Sum+(T.Count*T.Cena); { итоговая сумма }
  if not DDE1.ExecuteMacro(Tv, false)
   then begin
    MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0);
    exit;
   end;
 end;
 { Записываем итоговую сумму }
 StrPCopy(Tv,
  '[NextCell][Insert "Итого"][NextCell][NextCell][NextCell]'+
  '[Insert "'+FloatToStr(Sum)+'"]'));
 if not DDE1.ExecuteMacro(Tv, false)
  then MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0)
  else MessageDlg('Акт удачно создан. Перейдите в Microsoft Word.', 
        mtInformation, [mbOk], 0);
 StrDispose(Tv); StrDispose(Ss);
end;
 
Для Delphi 2 и выше
=== Cut Пример by Sergey Arkhipov 2:5054/88.10 ===
Пример проверен только на русском Word 7.0! Может, поможет...
unit InWord;
interface
uses
  ... ComCtrls; // Delphi3
  ... OLEAuto;  // Delphi2
[skip]
procedure TPrintForm.MPrintClick(Sender: TObject);
var W: Variant;
    S: String;
begin
  S:=IntToStr(Num); 
  try // А вдруг где ошибка :)
    W:=CreateOleObject('Word.Basic');
    // Создаем документ по шаблону MyWordDot
    // с указанием пути если он не в папке шаблонов Word
    W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0);
    // Отключение фоновой печати (на LJ5L без этого был пустой лист)
    W.ToolsOptionsPrint(Background:=0);
    // Переходим к закладке Word'a 'Num'
    W.EditGoto('Num'); W.Insert(S);
    //Сохранение
    W.FileSaveAs('C:\MayPath\Reports\MyReport')
    W.FilePrint(NumCopies:='2'); // Печать 2-х копий
  finally
    W.ToolsOptionsPrint(Background:=1);
    W:=UnAssigned;
  end;
end;
{.....}
=== Cut Конец примера ===
 
Спасибо Сергею :) И еще, как определить установлен ли на компьютере Word, запустить его и загрузить в него текст из программы? 
 
Пример: 
 
var
 MsWord: Variant;
...
try
 // Если Word уже запущен
 MsWord := GetActiveOleObject('Word.Application');
 // Взять ссылку на запущенный OLE объект
 except
  try
  // Word не запущен, запустить
  MsWord := CreateOleObject('Word.Application');
  // Создать ссылку на зарегистрированный OLE объект
  MsWord.Visible := True;
   except
    ShowMessage('Не могу запустить Microsoft Word');
    Exit;
   end;
  end;
 end;
...
MSWord.Documents.Add; // Создать новый документ
MsWord.Selection.Font.Bold := True; // Установить жирный шрифт
MsWord.Selection.Font.Size := 12; // установить 12 кегль
MsWord.Selection.TypeText('Текст');
 
По командам OLE Automation сервера см. help по Microsoft Word Visual Basic.
 
Ну вот и все. 
 
-------------------------------------------------------------
 
Работа с Word через OLE (24.03.00)
Я думаю, пример красноречивее пяти листов словоблудия ...
 
 
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  Buttons, ComCtrls, ExtCtrls, OleCtnrs;type  TForm1 = class(TForm)    OleContainer1: TOleContainer;    Panel1: TPanel;    StatusBar1: TStatusBar;    mbLoad: TSpeedButton;    mbPrint: TSpeedButton;    OpenDialog1: TOpenDialog;    procedure mbLoadClick(Sender: TObject);    procedure mbPrintClick(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.mbLoadClick(Sender: TObject);begin // Покажем диалог, и если он отработал, то загрузим в контейнер if OpenDialog1.Execute and (OpenDialog1.FileName<>'') then  OleContainer1.CreateObjectFromFile(OpenDialog1.FileName,false); // Если загрузилось что-нибудь, то покажем if OleContainer1.State <> osEmpty then  OleContainer1.DoVerb(ovShow);end;procedure TForm1.mbPrintClick(Sender: TObject);var V : Variant;begin if OleContainer1.State = osEmpty then Begin  MessageDlg('OLE не загружен !!', mtError, [mbOk],0);  exit; end;  // Получаем объект, который воплощает в себе WordBasic интерфейс  V := OleContainer1.OleObject.Application.WordBasic;  // Командуем до одурения ....  V.FilePrint;end;end.
 

Категория: 

Оценить: 

Голосов пока нет

Добавить комментарий

  _____  __     __   ___    _____  _____    ____ 
| ___| \ \ / / / _ \ |__ / | ____| / ___|
| |_ \ \ / / | | | | / / | _| | |
| _| \ V / | |_| | / /_ | |___ | |___
|_| \_/ \__\_\ /____| |_____| \____|
Enter the code depicted in ASCII art style.

Похожие публикации по теме