На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Работаем с Word , COM
    ExpandedWrap disabled
      Если у Вас нет на панели инструментов закладки  Servers  - то можно
      проделать следующее :
      Создаем новый пакет с использованием библиотеки типов. Выберите Project | Import
      Type library.
      Из списка зарегистрированных серверов выберите библиотеку типов Word (Microsoft
      Word 9.0 Object Library (на моем компьютере установлен Microsoft Office 2000,
      поэтому в списке присутствует 9.0, для предыдущих версий Office, номера версий
      будут меньше)).
      Укажите имя закладки палитры компонентов (Pallete Page), куда будут установлены
      новые классы - TWordGlobal, TWordApplication, TWordDocument, TWordFont,
      TWordParagraphFormat, TWordLetterContent. Выберите закладку Servers.
       
      Установите флажок General Component Wraper для генерации компонентов на основе
      библиотеки типов и размещения ее на палитре компонент, а затем нажмите кнопку
      Install.
      Установите сервер на палитру компонент.
      Если закладка -  Servers есть то выше перечисленные действия делать не надо.
      Фундаментальным объектом любого приложения является Application. Давайте получим
      к нему доступ .
      ·  создаем новый проект;
      ·  на главную форму выкладываем компонент WordApplication с закладки
      Servers;
      ·  устанавливаем свойства компонента AutoConnect и AutoQuit в True;
      ·  запускаем приложение на выполнение.
       
      Не забудьте добавить в #include <COMOBJ.hpp>.
      #pragma link "Word_2K_SRVR"- для 2000
      #pragma link "Word_97_SRVR"- для 97
      Если у вас обе строки добавлены то не избежать ошибок Ambiguity between
      В большинстве случаев нам надо подключиться  к уже существующему интерфейсу, а
      не создать его заново. Также это может быть необходимо, когда контроллер должен
      отслеживать события, происходящие в COM сервере. Рассмотрим следующий пример:
      ·  создаем новое приложение;
      ·  помещаем на форму компоненты WordApplication и WordDocument;
      ·  устанавливаем в True свойства AutoConnect и AutoQuit компонента
      WordApplication;
      ·  устанавливаем в значение ckAttachToInterface свойство ConnectKind для
      объекта WordDocument;
      ·  для события onDokumentChange прописываем такой код:
      ·      //производим подключение к текущему документу
      ·      WordDocument1->ConnectTo( WordApplication1.ActiveDocument);
      ·      //Контроллер добавляет новую строку в текущий документ
      ·      WordDocument1->Range->InsertAfter(#13+'Переход к документу'+#13+
      ·         WordApplication1->ActiveDocument->Get_FullName+' произведен :'+
      ·         DateTimeToStr(Now));
      для события OnFormCreate прописываем следующее:
      ·      WordApplication1->Visible=true;
        
      После запуска приложения будет автоматически загружен Microsoft Word, создайте в
      нем несколько новых документов и "попереключайтесь" между ними. Вы увидите, что
      контроллер автоматизации добавляет новые строки в текущий активный документ.
      Точно так же можно управлять и сервером ExcelApplication. При создании новой
      рабочей книги на сервере, в контроллере будет проинициализировано событие
      onNewWorkBook, которое можно обработать аналогично примеру с Word.
      Теперь рассмотрим еще один пример.
      Пусть существует необходимость формировать некий отчет в виде документа
      Microsoft Word, для чего нами используется файл-шаблон (к примеру, с именем
      test.doc). Поля, которые должны быть заменены, помечены символом «~» или другим
      сиволом который не встречается в отчете .Необходимо получить данные, а затем
      заменить метки реальными данными, после чего сформированный документ должен быть
      отправлен на печать, сохранен.
       В test.doc имеется шапка таблицы и нам необходимо заполнить таблицу данными из
      запроса (может бать любой контейнер с данными).
      Создадим новый проект и поместим на форму компоненты WordApplication(WApp),
      WordDocument(WDoc) и кнопку (TButton). В качестве обработчика события нажатия на
      кнопку укажем следующий код:
       //Следующие переменные понадобятся нам для выполнения методов сервера
       OleVariant FileName;
       OleVariant oldStr,newStr;
       OleVariant EmptyPar=False;
       OleVariant Yes=True;
       FileName=GetCurrentDir()+"\\test.doc";
       //Открываем шаблон документа
       WApp->Visible=false; // что бы не моргал при заполнении данными но можно
      поставить в true
                            // тогда весь процесс заполнения , замены будет на экране
       WApp->Caption = StringToOleStr("Отчет");//Задание заголовка для окна Word
       WApp->Documents->Add(FileName,EmptyParam);
       WDoc->ConnectTo(WApp->ActiveDocument);  //Связываем компонент с существующим интерфейсом
      /*
       WDoc->ConnectTo(WordApplication1->Documents->Item(ItemIndex));
       Если есть несколько открытых документов.
      */
       //Находим в документе метки и производим их замены
       oldStr=AnsiString("~1");
       newStr=AnsiString("Метка 1");
       WDoc->Range(EmptyParam,EmptyParam)->Find->Execute(oldStr,
       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
       newStr,Yes);
       
      TablePtr MyTable=WApp->ActiveDocument->Tables->Item(1) ;
      // получаем указатель на нашу таблицу
      RangePtr MyRange =MyTable->Range ;
        String s;
        TADOQuery * QF;
      Создадим запрос к примеру «select * from table1» как создавать запросы и
      работать с ними сдесь рассматривать не будем.
      В принципе это могут быть и таблицы (TTable)
       
       String pole;
       int Current=0; //счетчик
       QF->First();
       long j;
      while (!QF->Eof)
       {
        MyTable->Rows->Add(); // вставляем новую строку в таблицу
        int fild= QF->Fields->Count;
        String nPole;
        for (int p=1 ;p<fild-3 ;p++) // цикл по полям
        {
        MyTable->Borders->set_OutsideLineWidth(wdLineWidth300pt);
        MyTable->Borders->set_InsideLineStyle(wdLineStyleThinThickSmallGap);
        nPole=Table1->Fields->Fields[j]->AsString;//Можно делать проверку на тип и
      формат данных
        MyTable->Cell(1,p)->Range->InsertAfter(StringToOleStr(nPole));
        }
        QF->Next();
       }
      FileName= GetCurrentDir()+"\\newtest.doc";
      Сохраняем в формате Word 6.0/95 (*.doc)
      OleVariant EmptyS=StringToOleStr("");
      WDoc->SaveAs(FileName,(OleVariant)104,EmptyParam,
                EmptyS,Yes,EmptyS,
                EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam);
      WDoc->Close(EmptyParam,EmptyParam,EmptyParam);
       WApp->Visible=1;
       WApp->Disconnect();
       
       
      Некоторые полезные замечания :
         MyTable->Cell(j,1)->VerticalAlignment=wdCellAlignVerticalCenter;
         MyTable->Cell(j,1)->Range->Paragraphs->Alignment=wdAlignParagraphCenter;
       
      //Создание таблицы
      WordApplication1->Selection->Font->Bold = false;
      WordApplication1->ActiveDocument->Tables->Add(WordApplication1->Selection->Range
      , MainFrm->Query???->RecordCount + 9, 6);
       
      Этот код, он вставляет данные после таблицы
       
      //   String stn = "\n";
      //   String koltnS;       // строка для форматирования общей суммы в ???
      //   koltnS = koltnS.FormatFloat("0.00000", QF->?????->Value);
      //   stn = stn + "                                Сумма реализации:  "+ koltnS;
      //   WDoc->Range(EmptyParam,EmptyParam)->InsertAfter(StringToOleStr(stn));
      //   WordFont1->ConnectTo(WordDocument1->Sentences->get_Last()->get_Font());
      //   WordFont1->Size = 12;
      //   WordFont1->Bold = true;
      //   WordFont1->Color = wdColorIndigo;
       
      // Если понадобиться код объединения ячеек
       
       WordApplication1->Selection->Tables->Item(1)->Cell(4,1)->
       Merge(WordApplication1->Selection->Tables->Item(1)->Cell(4,6));
       
      Еще вариант сохранения док-та
         stn = MainFrm->DBEdit5->Text;
         int n = stn.Length();
         if (n == 1)   stn = "0" + stn;
         stn = "?????" + stn + MainFrm->Edit1->Text + ".doc";
         //Сохранение документа
         WordDocument1->SaveAs(&TVariant(WideString(stn)),
      &TVariant(wdFormatDocument));
      У меня не получается выполнить обращение к строке таблицы Word
      (RowPtr)(Table->Rows->Item(1))->Select()
      Что я делаю не так?

      С объектами CellPtr никаких проблем.
        Table->Rows->Item(1)->Select()?
        Цитата
        Dimas51, 13.07.04, 12:19
        (RowPtr*)(Table->Rows->Item(1))->Select()
          [У меня не получается выполнить обращение к строке таблицы Word
          (RowPtr)(Table->Rows->Item(1))->Select()
          Что я делаю не так?

          А как добавить строку в конец Таблицы?
          В Worde новая строка Tabом создается, а если в проге
          суешь "\t" - не хочет
          Сообщение отредактировано: Леопольд -
            Цитата
            Леопольд, 17.07.04, 05:24
            а если в проге
            суешь "\t" - не хочет

            "\n"
              Цитата

              Не забудьте добавить в #include <COMOBJ.hpp>.
              #pragma link "Word_2K_SRVR"- для 2000
              #pragma link "Word_97_SRVR"- для 97

              А для Office XP?
                Цитата Budda, 7.10.04, 13:38
                А для Office XP?

                А это без разницы, главное версия Word'а
                  А если ворд 2002? Кстати, эта штука нужна только для компиляции. Так? У клиента будет работать независимо от указанной строки. Да?
                    Цитата Budda, 7.10.04, 14:58
                    У клиента будет работать независимо от указанной строки. Да?
                    Не факт. У разных версий Word'а разная функциональность.
                      WordDocument1->ConnectTo( WordApplication1.ActiveDocument);
                      Наверное должно быть так:
                      WordDocument1->ConnectTo( WordApplication1->ActiveDocument);
                      Да?

                      А вот тут проблемы:
                      На строчку: WordDocument1->Range->InsertAfter
                      Компилятор ругается:
                      [C++ Error] untMain.cpp(26): E2288 Pointer to structure required on left side of -> or ->*

                      Требует что-то поставить после Range. Что делать? И есть ли дока на эти компоненты? WordApplication, WordDocument?

                      У меня в палитре есть ещё и WordGlobal. Это что и зачем? И ещё много разных компонент. Хотел бы доку почитать, если где-то есть. Дайте, плиз, хотя бы линк
                        WordDocument1 это и есть WDoc.
                        Цитата Bas, 14.04.04, 17:07
                        WDoc->ConnectTo(WApp->ActiveDocument);


                        Цитата Bas, 14.04.04, 17:07
                        WDoc->Range(EmptyParam,EmptyParam)->;


                        Цитата Bas, 14.04.04, 17:07
                        // WDoc->Range(EmptyParam,EmptyParam)->InsertAfter(StringToOleStr(stn));

                        Первое сообщение читали?
                          WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter("Test");

                          [C++ Error] untMain.cpp(30): E2034 Cannot convert 'char *' to 'wchar_t *'

                          ???

                          Bas, поделись плиз, источниками инфы, или хотя бы ключевыми словами, по которым искать нужно
                            L"Test"
                              Цитата Budda, 7.10.04, 17:04
                              WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter("Test");

                              ExpandedWrap disabled
                                WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter(StringToOleStr("Test"));
                              Поищи по форуму , кажеться я laifik скидывал и ссылки и архив.
                              Но всеравно главная инфа в хелпах Word,Excel.
                                Bas, Искал, искал... кучу линков топиков на тему нашёл, а вот твоих ссылок и архива - не нашёл...

                                Сейчас у меня проблема, что при компиляции WordApplication1->Visible получаю сообщение - метод недоступен... :(

                                А в Ворде - хэлпа нет на такие штуки... ?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0464 ]   [ 15 queries used ]   [ Generated: 13.05.24, 14:33 GMT ]