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

 
таблица в Вордовском документе, срочно нужно
nawok78
Отправлено: 14.02.2007, 14:27


Станционный диспетчер

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



На Дельфи создается таблица в Вордовском документе так:
CODE

MainTablePreLast:=WordDocument1.Tables.Add(R, 8, 3, EmptyParam, EmptyParam);

В Билдере пробовали — но там другие параметры...
кто знает как — просьба скинуть.
срочно нужно
Tantos
Отправлено: 14.02.2007, 14:49


Станционный диспетчер

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



Тебе надо именно через компонеты и без шаблонов?
nawok78
Отправлено: 14.02.2007, 14:57


Станционный диспетчер

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



Надо чтобы работало....
на дельфи есть код который пашет...
а с наблонами как? там же куча строк в таблице?

есть готовый код — скинь плиз
но главное чтоб к билдеровскому проекту было можно его приделать

Отредактировано nawok78 — 14.02.2007, 14:58
T@rEn
Отправлено: 01.03.2007, 10:24


Ученик-кочегар

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



Может эта статья тебе поможет:

HTML
Автор: Дмитрий Коваленко
Дата размещения: 09.01.02
Прочитано: 2172



В комплект поставки Borland C++ Builder Enterprise Suite версии 5.0 включена палитра компонентов "Servers", включающая в себя компоненты для работы с "Microsoft Office". Такие компоненты как "WordApplication", "WordDocument" и "WordFont" значительно облегчают работу с Microsoft Word. Но, отсутствие какой-либо документации, скудность help-ов и примеров, сводит, практически, на нет круг применения этих компонентов. В Internete достаточно широко обсуждается проблема работы с Microsoft Exel, поэтому, в данной статье, этот вопрос не будет затронут. Темой, рассматриваемой ниже, является общие принципы работы с Microsoft Word и, в частности, работа с таблицами. Данная статья рассчитана на наличие базовых понятий C++Builder у читателя.

И так, начнем. Создадим новое приложение и перенесем на него следующие компоненты — WordApplication, WordDocument, WordFont и Button. Создадим обработчик события Button1Click, в нем-то и развернутся основные действия. Добавим в него следующий код:

OleVariant ItemIndex = 1;
try
{
WordApplication->Connect();// пытаемся связаться с Word
}
catch (Exception &exception)
{// если произошла ошибка сообщим пользователю
MessageDlg("Word, в настоящее время, не установлен", mtError, TMsgDlgButtons() << mbYes, 0);
Abort;
}
WordApplication-
>Visible = True;
WordApplication->Caption = StringToOleStr("Пример для WORD"); // заголовок
// создаем новый документ и связываем его с компонентом WordDocument
WordDocument->ConnectTo(WordApplication->Documents->Add());
WordDocument->ConnectTo(WordApplication->Documents->Item(ItemIndex));

Теперь запустим проект и, при наличии установленного Word, увидим, что наше приложение запустило Word и создало в нем новый документ. Если же Word не установлен, мы получим аварийное сообщение. Мы еще в начале пути, но простота реализации задуманного начинает воодушевлять. Следующим шагом мы попытаемся добавить строку в новый документ. Пример из PWordDemo, входящего в комплект поставки, демонстрирует как это возможно сделать. Для этого добавим еще две строки к нашему коду:

AnsiString rs = "Это простой пример использования таблицы в Word";
WordDocument->Range(EmptyParam, EmptyParam)->InsertAfter(StringToOleStr(rs));

Теперь настало время подробнее поговорить о методе Range. Данный метод устанавливает определенные нами стартовую и конечную позиции диапазона символов, в пределах которого мы производим какие-либо операции. Начальная позиция в документе начинается с "0" и учитываются все символы, включая непечатные. Если, как в приведенном примере, начальный и конечный символ не определен, то под диапазоном подразумевается весь документ.

А теперь рассмотрим практическое применение этого метода. Если сейчас мы попробуем вставить в документ таблицу, используя для этого следующий код:

WordDocument->Tables->Add(WordDocument->Range(EmptyParam, EmptyParam), 4, 5);
Этот код предназначен для того, чтобы создать таблицу с четырьмя строками и пятью колонками. Применив его мы столкнемся с неприятным фактом — ранее введенная строка исчезла, а на ее месте появилась добавленная нами таблица. Для того, что бы избежать этого эффекта мы и воспользуемся методом Range. Вначале введем новую переменную:
OleVariant Start;
Данная переменная необходима в связи с тем, что входными параметрами метода Range является класс TVariant. Теперь вычислим длину введенной нами строки:
int tmp1 = rs.Length();
Start = (OleVariant)tmp1;
Теперь, используя полученное значение, мы можем получить желаемый результат, используя для этого следующий код:
WordDocument->Tables->Add(WordDocument->Range(Start, Start), 4, 5);
Откомпилировав и запустив проект, мы получим следующий документ:
Это простой пример использования таблицы в Word






Попробуем теперь заполнить полученную таблицу. Т.к. метод Range рассматривает все введенные символы в едином пространстве, т.е. не различая таблицу, то просто увеличим значение переменной Start для того, чтобы выбранный нами диапазон попал в первую ячейку таблицы:

rs = "Колонка1";
Start = (OleVariant)++tmp1;
WordDocument->Range(Start, Start)->InsertAfter(StringToOleStr(rs));

Показанный код добавит в первую строку первой колонки строку — "Колонка1". Для полноты примера добавим в первую строку второй колонки строку — "Колонка2". Для этого воспользуемся следующим кодом:

int tmp2 = ++tmp1;
tmp2 += rs.Length();
rs = "Колонка2";
Start = (OleVariant)tmp2;
WordDocument->Range(Start, Start)->InsertAfter(StringToOleStr(rs));

В результате получим следующий документ:
Это простой пример использования таблицы в Word

Колонка1 Колонка2



И так общий смысл заполнения таблицы стал достаточно ясен. Но стандартные размеры колонок, автоматически создаваемые в Word, чаше всего не удовлетворяют нуждам пользователей. Следующий пример продемонстрирует, как можно программно изменять ширину колонок. Для этого воспользуемся свойством "Columns" метода "Range". В первую очередь будем изменять значение переменной "Start" так, чтобы устанавливаемый нами диапазон попадал в требуемую ячейку. А затем, будем изменять ширину колонок. Следующий код продемонстрирует это на примере:

Start = (OleVariant)++tmp1;
WordDocument->Range(Start, Start)->Columns->Width = 150;
Start = (OleVariant)tmp2;
WordDocument->Range(Start, Start)->Columns->Width = 50;
tmp2 = ++tmp2 + rs.Length();
Start = (OleVariant)tmp2;
WordDocument->Range(Start, Start)->Columns->Width = 25;

А вот пример использования этого кода:
Это простой пример использования таблицы в Word Колонка1 Колонка2

Необходимо сделать одно замечание — увеличение переменной tmp2 на единицу в строке "tmp2 = ++tmp2 + rs.Length();" необходимо для того, чтобы учесть непечатный символ конца ячейки.
Рассмотрим еще одно свойство Columns — Borders. Данное свойство позволяет изменять тип оформления колонок. Вот пример, как сделать, чтобы бордюр вокруг этой колонки стал непечатным:

WordDocument->Range(Start, Start)->Columns-> Borders->OutsideLineStyle = wdLineStyleNone;

Часто в таблицу необходимо поместить большое количество колонок, для этого бывает удобно изменить ориентацию страницы с книжной на альбомную. Сделать это можно, добавив следующий код:

WordDocument->PageSetup->Orientation = wdOrientLandscape;

Теперь, немного облагородив наши предыдущие действия, мы получили следующий код в обработчике события Button1Click:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
OleVariant ItemIndex = 1;
try
{
try
{
WordApplication->Connect();
}
catch (Exception &exception)
{
MessageDlg("Word, в настоящий момент не установлен", mtError, TMsgDlgButtons() << mbYes, 0);
Abort;
}
WordApplication-
>Visible = True;
WordApplication->Caption = StringToOleStr("Пример для WORD");
WordDocument->ConnectTo(WordApplication->Documents->Add());
WordDocument->ConnectTo(WordApplication->Documents->Item(ItemIndex));
WordDocument->PageSetup->Orientation = wdOrientLandscape;
AnsiString rs = "Это простой пример использования таблицы в Word";
WordDocument->Range(EmptyParam, EmptyParam)->InsertAfter(StringToOleStr(rs));
OleVariant Start;
int tmp1 = rs.Length();
Start = (OleVariant)tmp1;
WordDocument->Tables->Add(WordDocument->Range(Start, Start), 4, 5);
rs = "Колонка1";
Start = (OleVariant)++tmp1;
WordDocument->Range(Start, Start)->InsertAfter(StringToOleStr(rs));
WordDocument->Range(Start, Start)->Columns->Width = 150;
++tmp1;
tmp1 += rs.Length();
rs = "Колонка2";
Start = (OleVariant)tmp1;
WordDocument->Range(Start, Start)->InsertAfter(StringToOleStr(rs));
WordDocument->Range(Start, Start)->Columns->Width = 50;
++tmp1;
tmp1 += rs.Length();
Start = (OleVariant)tmp1;
WordDocument->Range(Start, Start)->Columns->Width = 25;
}
catch (Exception &exception)
{
Application->ShowException(&exception);
WordApplication->Disconnect();
}
}

Приведенный пример будет не полон, если не рассмотреть так же вопросы сохранения файла и завершение работы с Word. Для этого добавим еще один TButton и создадим обработчик события Button2Click:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char curdir[MAXPATH];
strcpy(curdir, "X:\");
curdir[0] = 'A' + getdisk();
getcurdir(0, curdir+3);
AnsiString strFullFileName = curdir;
strFullFileName = strFullFileName + "\test.doc";
OleVariant FileName = strFullFileName;
WordDocument->SaveAs(FileName);
WordApplication->Disconnect();
}

Мне кажется, что приведенный выше код достаточно ясен и не требует дополнительного объяснения.

Данный пример вполне работоспособен и проверялся мной на Borland C++ Builder Enterprise Suite версии 5.0 без установленных обновлений и Microsoft Word 97 с установленным SP-2.

И еще несколько примеров полезных операций в Word:

1. Изменение формата выравнивания текста:

WordDocument->Range(Start, End)->Paragraphs->Format->Alignment = wdAlignParagraphRight;

где Start и End устанавливают границы параграфа, а wdAlignParagraphRight устанавливает формат выравнивания текста по правому краю.

2. Добавление колонки в таблицу:

End = (OleVariant)1;
WordDocument->Range(Start, Start)->Select();
WordDocument->Range(Start, Start)->Application->Selection->InsertRows(End);


при этом позиция Start должна находиться перед непечатным символом конца предшествующей колонки.

3. Объединение столбцов:

Start = (OleVariant)FirstRows;
// объединим 4 пустых столбца
End = (OleVariant)( FirstRows + 4);
WordDocument->Range(Start, End)->Select();
WordDocument->Range(Start, End)->Application->Selection->Cells->Merge();


4. Если количество создаваемых документов велико, то имеет смысл вынести процесс обработки в отдельную нить (thread). Для корректной работы придется воспользоваться шаблоном TinitOleT, который используется для инициализации СОМ-объектов (не стоит забывать, что Word является СОМ-сервером) для использования в текущей нити (thread). Для этого в начало процесса обработки добавим следующий код:

typedef TInitOleT<int> TInitOle;
TInitOle *iole;
iole= new TInitOle();
iole->Init();
.......................................


А после выполнения процесса не забудем освободить память

.....................
delete iole;


Дополнительную информацию можно почерпнуть из примера PWordDemo и файла word_97.h.

Tantos
Отправлено: 01.03.2007, 16:15


Станционный диспетчер

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



Глянь эту ссылку: http://borland.xportal.ru/forum/viewtopic.php?p=104856

Вернуться в Технологии COM/DCOM, ActiveX