C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите пожалуйста! Таблица в Word, Помогите пожалуйста! Таблица в Word
Николай
Отправлено: 04.12.2003, 09:58


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Помогите пожалуйста!

Не могу разобраться как передать таблицу в Word и как в эту таблицу вставить данные. Открываю Word и записываю данные следующим образом.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant msWord;
bool isWordRunning = true;
// Проверяю запущен ли Word
try
{
msWord = Variant::GetActiveObject("Word.Basic");
}
catch(EOleSysError&)
{
isWordRunning = false;
}


if(!isWordRunning)
{ //Открываю Word
msWord = CreateOleObject("Word.Basic");
msWord.Exec(Procedure("AppShow"));//Word видимый
msWord.Exec(Procedure("FileNew") << "Normal");
}

msWord.Exec(Procedure("Insert") << "Этот текст вставляю в Word");
}


А как поступить с таблицами, если я не использую такие компоненты как "WordApplication", "WordDocument" и "WordFont" .

Заранее спасибо.




Valdemar
Отправлено: 04.12.2003, 16:34


Мастер участка

Группа: Участник
Сообщений: 433



Попробуйте так
CODE
 Variant w, t, c;
  w=GetActiveOleObject("Word.Application");
   t=w.OlePropertyGet("ActiveDocument").OlePropertyGet("Tables").OleFunction("Item",ind_table);
   c=t.OleFunction("Cell",1,1);

здесь
w — документ;
t — таблица с индексом ind_table
с — ячейка [1,1] в таблице t
Николай
Отправлено: 04.12.2003, 18:14


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Может быть что-то не так делаю, но при запуске выдает "Ошибка"
Valdemar
Отправлено: 05.12.2003, 09:12


Мастер участка

Группа: Участник
Сообщений: 433



Приведенный пример взят из рабочей программы.
Строка
w=GetActiveOleObject("Word.Application");
подключается к уже открытому (к тому же активному) документу Word, в котором должна быть таблица номер ind_table. Если ни один документ не открыт или в активном документе нет таблицы с порядковым номером ind_table, то будет ошибка.
Николай
Отправлено: 05.12.2003, 11:41


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Спасибо за подсказку.
** laifik
Отправлено: 09.12.2003, 10:10


Не зарегистрирован







Тут все, что надо для Ворда
Код:

AnsiString NewFileName = ExtractFilePath(Application->ExeName) + ExtractFileName("Svodka.dot");

TVariant Template = NewFileName;

//Пустая строка
TVariant snew = "\n";
TVariant str;
//Направление сворачивания выделения
TVariant Direction = wdCollapseEnd;

//Определение количества записей после фильтрации таблицы
int chislr = 0;

TestModule->ADOQueryZapData->First();

for(TestModule->ADOQueryZapData->First(); !TestModule->ADOQueryZapData->Eof; TestModule->ADOQueryZapData->Next()) { chislr++; }

//Label13->Caption = "Количество записей в таблице: " +IntToStr(chislr);

//Соединение с Вордом
WordApp->Disconnect();
WordApp->Connect();
WordApp->GetDefaultInterface()->Visible = True;
//Запуск шаблона
WordApp->Documents->Add(&Template, EmptyParam);

//Вставить данные
SetFont();

//Включение текста заголовка 1
WordApp->Selection->InsertAfter(snew);
WordApp->Selection->InsertAfter(StringToOleStr("С В О Д К А\n"));

//Установка жирного шрифта
WordFont->ConnectTo(WordApp->Selection->Font);
WordFont->set_Bold(1);
WordParagraphFormat->ConnectTo(
WordApp->Selection->ParagraphFormat);
WordParagraphFormat->set_Alignment(wdAlignParagraphCenter);
//Снятие выделения
WordApp->Selection->Collapse(&Direction);

WordApp->Selection->InsertAfter(snew);
WordApp->Selection->InsertAfter(snew);
//Снятие выделения
WordApp->Selection->Collapse(&Direction);


WideString nr, nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10;
TablePtr tabler;
//Переход на вторую строку таблицы
int chislr1;
chislr1 = chislr+1;

//Формирование таблицы
WordApp->ActiveDocument->Tables->Add(WordApp->Selection->Range,chislr1,11); //создали таблицу 20 строк на 8 колонок
tabler=WordApp->ActiveDocument->Tables->Item(1);
tabler->LeftPadding=0;//отступы в ячейках слева
tabler->RightPadding=0;//и справа
WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Font->Size=12;//размер шрифта
//Обрамление всей таблицы
tabler->Borders->set_OutsideLineWidth(wdLineWidth075pt);
tabler->Borders->set_InsideLineStyle(wdLineStyleSingle);
//Обрамление слева
tabler->Borders->Item(wdBorderLeft)->set_LineWidth(wdLineWidth075pt);
tabler->Borders->Item(wdBorderLeft)->set_LineStyle(wdLineStyleSingle);
//Обрамление справа
tabler->Borders->Item(wdBorderRight)->set_LineWidth(wdLineWidth075pt);
tabler->Borders->Item(wdBorderRight)->set_LineStyle(wdLineStyleSingle);
//Обрамление сверху
tabler->Borders->Item(wdBorderTop)->set_LineWidth(wdLineWidth075pt);
tabler->Borders->Item(wdBorderTop)->set_LineStyle(wdLineStyleSingle);
//Обрамление снизу
tabler->Borders->Item(wdBorderBottom)->set_LineWidth(wdLineWidth075pt);
tabler->Borders->Item(wdBorderBottom)->set_LineStyle(wdLineStyleSingle);

//Обрамление каждой ячейки
tabler->Cell(chislr1,11)->Range->Borders ->set_OutsideLineWidth(wdLineWidth075pt);
tabler->Cell(chislr1,11)->Range->Borders ->set_InsideLineStyle(wdLineStyleSingle);

//Формирование заголовка таблицы
nr="Дата";
nr1="От кого";
nr2="Марка машины";
nr3="TRF";
nr4="Время работы с...";
nr5="Время работы по...";
nr6="Время с подачей";
nr7="Направление";
nr8="1 час в руб.";
nr9="Оплата в руб.";
nr10="Фирма";

tabler->Cell(1,1)->Range->InsertAfter(nr); // вставка текста
tabler->Cell(1,1)->set_Width(63);
tabler->Cell(1,1)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,2)->Range->InsertAfter(nr1); // вставка текста
tabler->Cell(1,2)->set_Width(36);
tabler->Cell(1,2)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,3)->Range->InsertAfter(nr2); // вставка текста
tabler->Cell(1,3)->set_Width(87.2);
tabler->Cell(1,3)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,4)->Range->InsertAfter(nr3); // вставка текста
tabler->Cell(1,4)->set_Width(29.8);
tabler->Cell(1,4)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,5)->Range->InsertAfter(nr4); // вставка текста
tabler->Cell(1,5)->set_Width(69);
tabler->Cell(1,5)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,6)->Range->InsertAfter(nr5); // вставка текста
tabler->Cell(1,6)->set_Width(69);
tabler->Cell(1,6)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,7)->Range->InsertAfter(nr6); // вставка текста
tabler->Cell(1,7)->set_Width(69);
tabler->Cell(1,7)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,8)->Range->InsertAfter(nr7); // вставка текста
tabler->Cell(1,8)->set_Width(99);
tabler->Cell(1,8)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,9)->Range->InsertAfter(nr8); // вставка текста
tabler->Cell(1,9)->set_Width(54);
tabler->Cell(1,9)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,10)->Range->InsertAfter(nr9); // вставка текста
tabler->Cell(1,10)->set_Width(63);
tabler->Cell(1,10)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание
tabler->Cell(1,11)->Range->InsertAfter(nr10); // вставка текста
tabler->Cell(1,11)->set_Width(99);
tabler->Cell(1,11)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание

TestModule->ADOQueryZapData->First();
do
{
for (int row=2;row<=tabler->Rows->Count;row++)

{
WideString xr;
xr="";

//Для первого столбца "Дата"
tabler->Cell(row,1)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[15]->AsString));
tabler->Cell(row,1)->set_Width(63);
tabler->Cell(row,1)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для второго столбца "От кого"
tabler->Cell(row,2)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[17]->AsString));
tabler->Cell(row,2)->set_Width(36);
tabler->Cell(row,2)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание

//Для третьего столбца "Марка машины"
tabler->Cell(row,3)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[19]->AsString));
tabler->Cell(row,3)->set_Width(87.2);
tabler->Cell(row,3)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для четвертого столбца "TRF"
tabler->Cell(row,4)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[22]->AsString));
tabler->Cell(row,4)->set_Width(29.8);
tabler->Cell(row,4)->Range->ParagraphFormat->Alignment=wdAlignParagraphCenter; //выравнивание

//Для пятого столбца "Время с..."
tabler->Cell(row,5)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[0]->AsString));
tabler->Cell(row,5)->set_Width(69);
tabler->Cell(row,5)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для шестого столбца "Время по..."
tabler->Cell(row,6)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[1]->AsString));
tabler->Cell(row,6)->set_Width(69);
tabler->Cell(row,6)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для седьмого столбца "Время с подачей"
tabler->Cell(row,7)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[4]->AsString));
tabler->Cell(row,7)->set_Width(69);
tabler->Cell(row,7)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для восьмого столбца "Направление"
tabler->Cell(row,8)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[27]->AsString));
tabler->Cell(row,8)->set_Width(99);
tabler->Cell(row,8)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

//Для девятого столбца "1 час в руб."
tabler->Cell(row,9)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[29]->AsString));
tabler->Cell(row,9)->set_Width(54);
tabler->Cell(row,9)->Range->ParagraphFormat->Alignment=wdAlignParagraphRight; //выравнивание

//Для десятого столбца "Оплата"
tabler->Cell(row,10)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[6]->AsString));
tabler->Cell(row,10)->set_Width(63);
tabler->Cell(row,10)->Range->ParagraphFormat->Alignment=wdAlignParagraphRight; //выравнивание

//Для одиннадцатого столбца "Фирма"
tabler->Cell(row,11)->Range->InsertAfter(StringToOleStr(TestModule->ADOQueryZapData->Fields->Fields[24]->AsString));
tabler->Cell(row,11)->set_Width(99);
tabler->Cell(row,11)->Range->ParagraphFormat->Alignment=wdAlignParagraphLeft; //выравнивание

TestModule->ADOQueryZapData->Next();
}
}
while (TestModule->ADOQueryZapData->Eof!=TRUE);

//Форматирование заголовка таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;
WordApp->Selection->MoveRight(&TVariant(wdCell)); // перейти к следующей ячейке таблицы
WordApp->Selection->Range->Cells->VerticalAlignment = wdCellAlignVerticalCenter; //выравнивание по центру
WordApp->Selection->SelectCell();
WordApp->Selection->Font->Bold = true;

//Код объединения ячеек
/* WordApp->Selection->Tables->Item(1)->Cell(1,2)
->Merge(WordApp->Selection->Tables->Item(1)->Cell(1, 5)); */

//Выделение строк
WordApp->Options->ReplaceSelection = true;
WordApp->Selection->Range->Cells->set_Height(41.85);
//Сделать шапку заголовком таблицы
WordApp->Selection->Rows->HeadingFormat = wdToggle;

//Снятие выделения
WordApp->Selection->Collapse(&Direction);

//TestModule->ADOQueryZapData это или Table или Query. Нет времени менять. Подставьте свой источник.
//Fields[29]- номер индекса поля в коде редактора таблицы или запроса
//Svodka.dot — название вордовского шаблона (можно запустить просто Ворд smile.gif

Вернуться в Вопросы программирования в C++Builder