Создание отчета в MS Word | sprawka.net - Ваш надежный помощник в поиске информации 
Спонсор странички

Новые комментарии
Комментарии отсутствуют.

Вы здесь

Главная » Программирование

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

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

 

 

(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:

var MsWord : variant;

MsWord := CreateOleObject('Word.Basic'); Для Delphi 3, пример ниже)

 

Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет "глюки"), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны зеленым цветом, реально они конечно не видны):

 

Накладная ? 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.

 

Другие материалы

Основы баннерной рекламы. Книга соде
Новое руководство по фо
Война роботов. Секреты мастеров: война роботов или ка
Воспоминания. В этом уникальном издании собраны воспоминания Варлама Тихоновича Шаламова - поэта и прозаика, чье творчество стало откровением для нескольких поколений русских читателей.
Фитнес-сегмент развивается небывалыми темпами! Сегодня индустрия спортивных услуг может порадовать любого разнообразием предлагаемых продуктов.
Блины, блинчики, оладьи. По рецепта
Покер – не просто игра или способ заработать немного (или даже много) денег. Покер – весьма необычная среда взаимодействия индивидов, которая в несколько карикатурной манере имитирует настоящее человеческое сообщество.
Макроэкономика. Целью экономической теории является из
Ремень – символ вкуса у настоящего мужчины, а также показатель его имиджа и статуса в обществе. Сложно встретить сегодня такого человека, который бы не носил этот аксессуар. Напротив, отсутствие ремня считается неприличным образом.