
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#1
,
|
|
![]() ![]() Если у Вас нет на панели инструментов закладки 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)); |
Сообщ.
#2
,
|
|
|
У меня не получается выполнить обращение к строке таблицы Word
(RowPtr)(Table->Rows->Item(1))->Select() Что я делаю не так? С объектами CellPtr никаких проблем. |
![]() |
Сообщ.
#3
,
|
|
Table->Rows->Item(1)->Select()?
Цитата Dimas51, 13.07.04, 12:19 (RowPtr*)(Table->Rows->Item(1))->Select() |
Сообщ.
#4
,
|
|
|
[У меня не получается выполнить обращение к строке таблицы Word
(RowPtr)(Table->Rows->Item(1))->Select() Что я делаю не так? А как добавить строку в конец Таблицы? В Worde новая строка Tabом создается, а если в проге суешь "\t" - не хочет |
![]() |
Сообщ.
#5
,
|
|
Цитата Леопольд, 17.07.04, 05:24 а если в проге суешь "\t" - не хочет "\n" |
Сообщ.
#6
,
|
|
|
Цитата Не забудьте добавить в #include <COMOBJ.hpp>. #pragma link "Word_2K_SRVR"- для 2000 #pragma link "Word_97_SRVR"- для 97 А для Office XP? |
![]() |
Сообщ.
#7
,
|
|
Цитата Budda, 7.10.04, 13:38 А для Office XP? А это без разницы, главное версия Word'а |
Сообщ.
#8
,
|
|
|
А если ворд 2002? Кстати, эта штука нужна только для компиляции. Так? У клиента будет работать независимо от указанной строки. Да?
|
Сообщ.
#9
,
|
|
|
Цитата Budda, 7.10.04, 14:58 Не факт. У разных версий Word'а разная функциональность. У клиента будет работать независимо от указанной строки. Да? |
Сообщ.
#10
,
|
|
|
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. Это что и зачем? И ещё много разных компонент. Хотел бы доку почитать, если где-то есть. Дайте, плиз, хотя бы линк |
![]() |
Сообщ.
#11
,
|
|
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)); Первое сообщение читали? |
Сообщ.
#12
,
|
|
|
WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter("Test");
[C++ Error] untMain.cpp(30): E2034 Cannot convert 'char *' to 'wchar_t *' ??? Bas, поделись плиз, источниками инфы, или хотя бы ключевыми словами, по которым искать нужно |
Сообщ.
#13
,
|
|
|
L"Test"
|
![]() |
Сообщ.
#14
,
|
|
Цитата Budda, 7.10.04, 17:04 WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter("Test"); ![]() ![]() WordDocument1->Range(EmptyPar,EmptyPar)->InsertAfter(StringToOleStr("Test")); Но всеравно главная инфа в хелпах Word,Excel. |
Сообщ.
#15
,
|
|
|
Bas, Искал, искал... кучу линков топиков на тему нашёл, а вот твоих ссылок и архива - не нашёл...
Сейчас у меня проблема, что при компиляции WordApplication1->Visible получаю сообщение - метод недоступен... ![]() А в Ворде - хэлпа нет на такие штуки... ? |