Работа с OLE-сервером Word.

Пример программы. Работа с OLE-сервером Word.

1. Постановка задачи.

Генеральный директор некоторой фирмы "Рога и копыта" г. Бендер потребовал от своего зама подавать ему три раза в неделю в писменном виде обобщенные данные о работе отделов фирмы. Причем данные от различных отделов по дням недели. И хотя отделов и немного, (а если бы было 100?) но даже заставив всех подать данные в виде файлов Word, все же необходимо самому их компоновать, писать заголовок. Заместитель Балаганов пошел по простому пути - заказал на остатки Корейковских денег программку, которая бы объединяла документы, подаваемые подчиненными в один.

Программист установил для каждого из отделов имя .doc документа и добился, чтобы они заполняли этот документ и помещали в некотурую директорию.

ole_3_1.gif

Програмке осталось собрать документы в один и напечатать шапочку как например показано на рисунке. Естественно, что текст каждого документа может быть и гораздо больше и, вообще, сколь угодно длинным.

ole_3_2.gif

В начало

2. Описание программы.

Для реализации программы на форму помещены компоненты:

ole_3_3.gif

При старте программы доступны для нажатия три кнопочки (1-3) - с их помощью осуществляется выбор из директории где хранятся документы списка файлов этих документов. Все остальные действия выполняются также нажатием кнопочек. Выполняемые действия соответствуют Caption кнопки. Дата для имени итогового файла и заглавия документа берется из MaskEdit. Имена сохраняемых файлов:

Программа при работе отображает один итоговый документ Word в котором можно наблюдать процесс его формирования.

Принцип работы программы:


В начало

3. Текст программы.

Файл account.cpp:

#include      
#include      
#include      
#include      
#pragma       hdrstop
#include      "account.h"
//--------------------------------------------------
#pragma       package(smart_init)
#pragma       resource "*.dfm"
TForm1        *Form1;
//Переменные для OLE серверов Word
Variant       vVarApp,vVarDocs,vVarDoc,
              vVarParagraphs,vVarParagraph;
Variant       vVarApp1,vVarDocs1,vVarDoc1;
//Рабочая директория где файлы для сбора в документ
AnsiString    vasWorkDir="C:\\Bulletins";
//--------------------------------------------------
// Конструктор
//--------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------
// При создании формы
//--------------------------------------------------
void __fastcall
TForm1::FormCreate(TObject *Sender)
{
 //Флаги серверов OLE
 fStart=false;
 fStart1=false;
 //Флаг переноса по одному документу
 fSingle=false;
 //Заносим дату для отображения в документе
 AnsiString Format = "dd.mm.yyyy";
 tdate = tdate.CurrentDate();
 MaskEdit1->Text = tdate.FormatString(Format);
 //Тип отчета, Вторник=0, Четверг=1, Суббота=1
 viTip=0;
}
//--------------------------------------------------
// Чтение имен файлов с документами
//--------------------------------------------------
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
 AnsiString vasFilename,    //имя файла
            vasFileMask;    //маска файла
 //TSearchRec информация о файле
 TSearchRec tFileInfo;
 //Задаем маску
 vasFileMask="*.doc";
 //ОБудем определять имена файлов в ListBox1
 ListBox1->Items->Clear();
 vasFilename=vasWorkDir+"\\"+vasFileMask;
 //Находим первый файл с расширением .doc
 if(FindFirst(vasFilename,faAnyFile,tFileInfo) == 0)
 {
  while(1)
  {
   //Выделяем имя файла
   AnsiString s=Trim(tFileInfo.Name);
   switch(viTip)
   {
    //Выбираем файлы относящиеся к выбранному дню недели:
    case 0:
     //0.На первом месте В, на втором Т
     if(s.IsDelimiter("В",1) && s.IsDelimiter("Т",2))
      ListBox1->Items->Add(s);
    break;
    case 1:
     //1.На первом месте Ч, на втором Е
     if(s.IsDelimiter("Ч",1) && s.IsDelimiter("Е",2))
      ListBox1->Items->Add(s);
    break;
    case 2:
     //2.На первом месте С, на втором У
     if(s.IsDelimiter("С",1) && s.IsDelimiter("У",2))
       ListBox1->Items->Add(s);
    break;
   }//switch(viTip)
   //Выходим если нет более файлов DOC в директории
   if(FindNext(tFileInfo) != 0)  break;
  }//while(1)
 }//if(FindFirst(vasFilename,faAnyFile,tFileInfo) == 0)
 //Разрешаем работу с кнопками
 Button4->Enabled=true;
 Button5->Enabled=true;
 Button6->Enabled=true;
 Button7->Enabled=true;
 Button2->Enabled=false;
 Button3->Enabled=false;
 Button1->Enabled=false;
}
//--------------------------------------------------
// Включение в отчет всех документов
//--------------------------------------------------
void __fastcall
TForm1::Button4Click(TObject *Sender)
{
 fSingle=false;
 vWork();
}
//--------------------------------------------------
// Включение в отчет очередного документа(по одному)
//--------------------------------------------------
void __fastcall
TForm1::Button5Click(TObject *Sender)
{
 fSingle=true;
 vWork();
 ListBox1->Items->Delete(0);
}
//--------------------------------------------------
//   Пропуск документа
//--------------------------------------------------
void __fastcall
TForm1::Button6Click(TObject *Sender)
{
 ListBox1->Items->Delete(0);
 if(ListBox1->Items->Count == 0)
 {
  Button4->Enabled=false;
  Button5->Enabled=false;
  Button6->Enabled=false;
  Button7->Enabled=false;
  Caption="Отчет о работе фирмы сформирован";
 }
}

//--------------------------------------------------
// Основная функция для добавления документа
//--------------------------------------------------
void __fastcall
TForm1::vWork()
{
 Button8->Enabled=true;
 Button9->Enabled=true;
 Button10->Enabled=true;
 Button11->Enabled=true;
 //Если не создан сервер для основного документа
 if(!fStart)
 {
  try
  {
   //Создаем сервер Word
   vVarApp=CreateOleObject("Word.Application");
   //Будем смотреть как формируется документ
   vVarApp.OlePropertySet("Visible",true);
   vVarDocs=vVarApp.OlePropertyGet("Documents");
   //Добавляем один документ в отчет
   vVarDocs.OleProcedure("Add");
   //И работать будем с этим документом
   vVarDoc=vVarDocs.OleFunction("Item",1);
   //Добавляем параграф и выводим в него текст ЗАГЛАВИЯ
   vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
   vVarDoc.OleProcedure("Activate");
   vVarParagraphs.OleProcedure("Add");
   AnsiString str="Отчет о работе фирмы \"РОГА и КОПЫТА\" за";
   vVarParagraph=vVarParagraphs.OleFunction("Item",1);
   vVarParagraph.OlePropertyGet("Range").
             OlePropertySet("Text",str.c_str());
   // Устанавливаем атрибуты текста
   vVarParagraph.OlePropertySet("Alignment",1);
   Variant v=vVarParagraph.OlePropertyGet("Range").
                OlePropertyGet("Font");
   v.OlePropertySet("Color",clRed);
   v.OlePropertySet("Size",16);
   v.OlePropertySet("Name","Times New Roman");
   v.OlePropertySet("Bold",true);
   v.OlePropertySet("Italic",true);
   v.OlePropertySet("Underline",1);
   //Добавляем еще один параграф и выводим в него дату
   v=vVarApp.OlePropertyGet("Selection");
   v.OleFunction("EndKey");
   v.OleFunction("TypeParagraph");
   vVarParagraphs.OleProcedure("Add");
   vVarParagraph=vVarParagraphs.OleFunction("Item",2);
   AnsiString vasd0=MaskEdit1->Text;
   AnsiString vasd1=(AnsiString)vasd0[1]+ (AnsiString)vasd0[2];
   viDay=vasd1.ToInt();
   vasd1=(AnsiString)vasd0[4]+(AnsiString)vasd0[5];
   viMon=vasd1.ToInt();
   vasd1=(AnsiString)vasd0[7]+(AnsiString)vasd0[8] +
             (AnsiString)vasd0[9]+(AnsiString)vasd0[10];
   viYear=vasd1.ToInt();
   //Выводим текст
   char szBuf[40];
   wsprintf(szBuf,"%d.%d.%04d г.",viDay,viMon,viYear);
   vVarParagraph.OlePropertyGet("Range").
                 OlePropertySet("Text",szBuf);
   v=vVarApp.OlePropertyGet("Selection");
   //Делаем отступ от заглавия еще два параграфа
   v.OleFunction("EndKey");
   v.OleFunction("TypeParagraph");
   vVarParagraphs.OleProcedure("Add");
   //Убираем подчеркивание, чтобы не отображалось в HTML
   vVarParagraph.OlePropertyGet("Range").OlePropertyGet("Font").
                 OlePropertySet("Underline",0);
   v.OleFunction("EndKey");
   v.OleFunction("TypeParagraph");
   vVarParagraphs.OleProcedure("Add");
   v.OleFunction("EndKey");
   v.OleFunction("TypeParagraph");
   //Текущий парагоаф - четвертый
   vVarParagraph=vVarParagraphs.OleFunction("Item",4);
   if(!fSingle)
   {
    Button5->Enabled=false;
    Button6->Enabled=false;
    Button7->Enabled=false;
   }
   //Сервер Word запущен
   fStart=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Word",
                 "Ошибка", MB_OK);
  return;
  }
 }
 //Начинаем добавлять документы или все или по одному
 int number=1;
 if(!fSingle) number=ListBox1->Items->Count;
 for(int i=0; i < number; i++)
 {
  try
  {
   vVarApp1=CreateOleObject("Word.Application");
   //Чтобы не мешался уберем
   //vVarApp1.OlePropertySet("Visible",true);
   fStart1=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Word\n"
                 "для переносимого документа",
                 "Ошибка", MB_OK);
  return;
  }
  AnsiString s=Trim(ListBox1->Items->Strings[i]);
  vVarDocs1=vVarApp1.OlePropertyGet("Documents");
  //Печатаем заголовок раздела из имени файла
  vCaptionChapter(s);
  //Где файл
  s=vasWorkDir+"\\"+s;
  //Добавляем его
  vAddWord(s);
 }
 //Если добавляли не по одному - чистим (все добавлено)
 if(!fSingle) ListBox1->Items->Clear();
 if(ListBox1->Items->Count == 0)
 {
  Button4->Enabled=false;
  Button5->Enabled=false;
  Button7->Enabled=false;
  Button11->Enabled=false;
  Caption="Отчет сформирован, можно внести исправления";
 }
}
//--------------------------------------------------
//     Печать заголовка раздела из имени файла
//--------------------------------------------------
void __fastcall
TForm1::vCaptionChapter(AnsiString s)
{
 //Убираем расширение после точки в имени файла
 s.SetLength(s.LastDelimiter("."));
 s=s.SubString(s.Pos("_")+1,s.Length()-s.Pos("_")+1);
 if(s[1] == '0') s[1]=' ';
 //Работаем с основным документом и с первой страницей
 try
 {
  vVarDoc=vVarDocs.OleFunction("Item",1);
  vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
  vVarDoc.OleProcedure("Activate");
  //Добавляем параграф
  vVarParagraphs.OleProcedure("Add");
  ////vVarParagraph=vVarParagraphs.OleFunction("Item",nom);
  //Выводим текст в данный параграф
  vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",s.c_str());
  // Устанавливаем атрибуты текста
  vVarParagraph.OlePropertySet("Alignment",1);
  //Шрифт текста
  Variant v=vVarParagraph.OlePropertyGet("Range").
                          OlePropertyGet("Font");
  v.OlePropertySet("Color",clBlue);
  v.OlePropertySet("Size",14);
  v.OlePropertySet("Name","Times New Roman");
  v.OlePropertySet("Bold",true);
  v.OlePropertySet("Italic",true);
  v.OlePropertySet("Underline",1);
  //Уходим в конец
  v=vVarApp.OlePropertyGet("Selection");
  v.OleFunction("EndKey");
  //Добавляем параграф для вставки
  v.OleFunction("TypeParagraph");
  vVarParagraphs.OleProcedure("Add");
  vVarParagraph.OlePropertyGet("Range").OlePropertyGet("Font").
                 OlePropertySet("Underline",0);
 }
 catch(...)
 {
  MessageBox(0, 
    "Ошибка при печати заголовка очередного документа",
    "Ошибка", MB_OK);
  return;
 }
}
//--------------------------------------------------
//  Сохранить .doc
//--------------------------------------------------
void __fastcall
TForm1::Button8Click(TObject *Sender)
{
 Button4->Enabled=false;
 Button5->Enabled=false;
 Button6->Enabled=false;
 Button7->Enabled=false;
 if(fStart)
 {
  char szBuf[MAX_PATH];
  wsprintf(szBuf,"%s\\Report%d.%d.%04d.doc",
                vasWorkDir,viDay,viMon,viYear);
  try
  {
   vVarDoc=vVarDocs.OleFunction("Item",1);
   vVarApp.OlePropertySet("DisplayAlerts",false);
   vVarDoc.OleProcedure("SaveAs",szBuf,0,false,"",true,"",
                 false,false,false,false,false);
  }
  catch(...)
  {
   MessageBox(0, 
     "Ошибка при сохранении документа в формате .doc",
      "Ошибка", MB_OK);
  return;
  }
  if(Button9->Enabled == false)
  {
   vVarApp.OleProcedure("Quit");
   fStart=false;
   Button11->Enabled=false;
   Button12->Caption="Выйти";
  }
  Button8->Enabled=false;
  Button10->Enabled=false;
 }//if(fStart)
}
//--------------------------------------------------
//  Сохранить .html
//--------------------------------------------------
void __fastcall
TForm1::Button9Click(TObject *Sender)
{
 Button4->Enabled=false;
 Button5->Enabled=false;
 Button6->Enabled=false;
 Button7->Enabled=false;
 if(fStart)
 {
  char szBuf[MAX_PATH];
  wsprintf(szBuf,"%s\\Report%d.%d.%04d.htm",
                vasWorkDir,viDay,viMon,viYear);
  try
  {
   vVarDoc=vVarDocs.OleFunction("Item",1);
   vVarApp.OlePropertySet("DisplayAlerts",false);
   vVarDoc.OleProcedure("SaveAs",szBuf,8,false,"",true,"",
                 false,false,false,false,false);
  }
  catch(...)
  {
   MessageBox(0, 
     "Ошибка при сохранении документа в формате .html",
     "Ошибка", MB_OK);
  return;
  }
  if(Button8->Enabled == false)
  {
   vVarApp.OleProcedure("Quit");
   fStart=false;
   Button11->Enabled=false;
   Button12->Caption="Выйти";
  }
  Button9->Enabled=false;
  Button10->Enabled=false;
 }//if(fStart)
}
//--------------------------------------------------
//  Сохранить сразу .doc и .html
//--------------------------------------------------
void __fastcall
TForm1::Button10Click(TObject *Sender)
{
 Button8Click(NULL);
 Button9Click(NULL);
}
//--------------------------------------------------
//   Сохранить сразу .doc и .html и выйти
//--------------------------------------------------
void __fastcall
TForm1::Button11Click(TObject *Sender)
{
 Button9Click(NULL);
 Button8Click(NULL);
 if(fStart)
  vVarApp.OleProcedure("Quit");
 if(fStart1)
  vVarApp1.OleProcedure("Quit");
 Close();
}
//--------------------------------------------------
//   Выйти без сохранения
//--------------------------------------------------
void __fastcall
TForm1::Button12Click(TObject *Sender)
{
 if(fStart)
 {
  char szBuf[MAX_PATH];
  wsprintf(szBuf,"C:\\a.doc");
  vVarDoc=vVarDocs.OleFunction("Item",1);
  vVarApp.OlePropertySet("DisplayAlerts",false);
  vVarDoc.OleProcedure("SaveAs",szBuf,1,false,"",true,"",
                false,false,false,false,false);
  vVarApp.OleProcedure("Quit");
 }
 if(fStart1)
 {
  vVarApp1.OlePropertySet("DisplayAlerts",false);
  vVarApp1.OleProcedure("Quit");
 }
 Close();
}
//--------------------------------------------------
//  Первый в конец списка
//--------------------------------------------------
void __fastcall
TForm1::Button7Click(TObject *Sender)
{
 ListBox1->Sorted=false;
 AnsiString s=Trim(ListBox1->Items->Strings[0]);
 ListBox1->Items->Delete(0);
 ListBox1->Items->Add(s);
}
//--------------------------------------------------
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
 viTip=1;
 Button1Click(NULL);
}
//--------------------------------------------------
void __fastcall
TForm1::Button3Click(TObject *Sender)
{
 viTip=2;
 Button1Click(NULL);
}
//--------------------------------------------------
void __fastcall
TForm1::vAddWord(AnsiString s)
{
 try
 {
  //Читаем очередной документ
  vVarDocs1.OleProcedure("Open",s.c_str());
  //Выделяем его
  Variant v1=vVarApp1.OlePropertyGet("Selection");
  v1.OleFunction("WholeStory");
  //Копируем в буфер
  v1.OleFunction("Copy");
  //Из буфера обмена добавляем в основной документ
  Variant v=vVarApp.OlePropertyGet("Selection");
  v.OleFunction("Paste");
  //Добавляем пустой параграф
  v.OleFunction("EndKey");
  v.OleFunction("TypeParagraph");
  //Выходим из добавленного
  vVarApp1.OleProcedure("Quit");
  fStart1=false;
  s=Trim(ListBox1->Items->Strings[1]);
 }
 catch(...)
 {
  MessageBox(0, "Ошибка при добавлении документа",
                "Ошибка", MB_OK);
 return;
 }
}
//--------------------------------------------------

Файл account.h

#ifndef    accountH
#define    accountH
#include   
#include   
#include   
#include   
#include   
#include   
//--------------------------------------------------
class
TForm1 : public TForm
{
 __published:
  TListBox         *ListBox1; 
  TButton          *Button1;
        TButton *Button4;
        TButton *Button5;
        TButton *Button6;
        TButton *Button8;
        TButton *Button9;
        TButton *Button10;
        TButton *Button11;
        TButton *Button12;
        TButton *Button7;
  TMaskEdit        *MaskEdit1;
        TButton *Button2;
        TButton *Button3;
  TMemo            *Memo1;
  void __fastcall  FormCreate(TObject *Sender);
  void __fastcall  Button1Click(TObject *Sender);
  void __fastcall  Button4Click(TObject *Sender);
  void __fastcall  Button5Click(TObject *Sender);
  void __fastcall  Button6Click(TObject *Sender);
  void __fastcall  Button9Click(TObject *Sender);
  void __fastcall  Button10Click(TObject *Sender);
  void __fastcall  Button11Click(TObject *Sender);
  void __fastcall  Button12Click(TObject *Sender);
  void __fastcall  Button7Click(TObject *Sender);
  void __fastcall  Button2Click(TObject *Sender);
  void __fastcall  Button3Click(TObject *Sender);
  void __fastcall  Button8Click(TObject *Sender);
 private:
  bool                  fStart,fStart1,fStart2;
  bool                  fSingle;
  int                   viDay,viMon,viYear;
  int                   viTip;
  void __fastcall       vWork();
  void __fastcall       vCaptionChapter(AnsiString s);
  void __fastcall       vAddWord(AnsiString s);
  TDateTime             tdate;
 public:
  __fastcall      TForm1(TComponent* Owner);
};
//--------------------------------------------------
extern PACKAGE TForm1 *Form1;
//--------------------------------------------------
#endif


В начало

Введение

Работа с OLE-сервером Excel

Работа с OLE-сервером Word

Домой



Сайт управляется системой uCoz