Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с таблицами в Word


Александр ©   (2009-05-27 11:43:00) 

Добый день. Уважаемые Мастера подскажите в чём проблема. Когда Word визуализирован перед выполнением приведённого ниже фрагмента, всё работает, но достаточно Word спрятать и программа вываливается с ошибкой о недопустимости оператора WordApplication1.Selection.Cells.Merge. Как с этим справиться? Спасибо.

WordApplication1.Selection.Paragraphs.Alignment:=wdAlignParagraphLeft;
WordApplication1.Selection.Font.Size:=12;
DefaultTableBehavior:=wdWord9TableBehavior;
AutoFitBehavior:=wdAutoFitFixed;
Unit_:=wdCell;
Count:=1;
WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,2,5, DefaultTableBehavior,AutoFitBehavior);
WordApplication1.Selection.TypeText('№№ п/п');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Наименование ');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Проводимые операции');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Количество');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Примечание');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('1');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('2');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('3');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('4');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('5');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Две и более');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('блокирование');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Ликвидация');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Работы не проводились');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Всего');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 Count:=4;
 WordApplication1.Selection.MoveLeft(Unit_,Count,EmptyParam);
 Unit_:=wdLine;
 RouteDocument:=wdExtend;
 Count:=4;
 WordApplication1.Selection.MoveUp(Unit_,Count,RouteDocument);

 WordApplication1.Selection.Cells.Merge;

 WordApplication1.Selection.TypeText(IntToStr(i));
 Count:=1;
 Unit_:=wdCell;
 WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 Unit_:=wdLine;
 Count:=4;
 WordApplication1.Selection.MoveDown(Unit_,Count,RouteDocument);
 WordApplication1.Selection.Cells.Merge;
 WordApplication1.Selection.TypeText(kodif.FieldByName('text').AsString);
 Count:=1;
 Unit_:=wdCell;
 WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.TypeText(IntToStr(rab[1]));
 for m:=1  to 5 do
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.TypeText(IntToStr(rab[2]));
 for m:=1  to 5 do
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.TypeText(IntToStr(rab[3]));
 for m:=1  to 5 do
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.TypeText(IntToStr(rab[4]));
 for m:=1  to 5 do
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 WordApplication1.Selection.TypeText(IntToStr(DTP.RecordCount));
 WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
 if i mod 5=0 then
   begin
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
   RouteDocument:=wdPageBreak;
   WordApplication1.Selection.InsertBreak(RouteDocument);
   WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,2,5, DefaultTableBehavior,AutoFitBehavior);
   WordApplication1.Selection.TypeText('1');
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
   WordApplication1.Selection.TypeText('2');
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
   WordApplication1.Selection.TypeText('3');
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
   WordApplication1.Selection.TypeText('4');
   WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
   WordApplication1.Selection.TypeText('5');
   end;
 kodif.Next;

 end;
//сохранение документа
FileName:=ExtractFilePath(Application.ExeName)+’1.doc’;
WordDocument1.SaveAs(FileName);
ShowMessage('Всего: '+IntToStr(all));
//WordApplication1.Visible:=True;
//WordApplication1.Disconnect;


KilkennyCat   (2009-05-27 13:48:00) [1]


> Александр © (27.05.09 12:58) [6]

http://ekrtf.code.net.ru/


Andy BitOff   (2009-05-27 13:47:00) [2]

Работайте через Range, не надо никаких Select могут возникнуть проблемы на пустом месте.
WhereTable1End := WordApp.ActiveDocument.Tables.item(4);
myRange := WordApp.ActiveDocument.Range(WhereTable1End.Cell(i + CurrLine, 1).Range.Start, (IDispatch(WhereTable1End.Cell(i + CurrLine, WhereTable1End.Columns.Count).Range) as RangeDisp).End_);
myRange.Cells.Merge;
myRange.ParagraphFormat.Alignment := wdAlignParagraphLeft;
myRange.Cells.Shading.BackgroundPatternColor := panLineBgrColor.Color;
WhereTable1End.Cell(i + CurrLine, 1).Range.Font.Bold := True;
WhereTable1End.Cell(i + CurrLine, 1).Range.Text := 'вввв';

Первая строка через IDispatch только для того, чтобы в D7 не было проблем с ключевым словом end, можно заменить на WhereTable1End.Cell(i + 7, WhereTable1End.Columns.Count).Range.End)


Vitaliy_____   (2009-05-27 13:12:00) [3]

У меня как-то были подобные проблемы с объединением ячеек. Деталей сейчас не могу сказать, не помню. Но решение было такое:
Запоминал те ячейки, где надо объединить (в динамический массив, т.к. их количество заранее неизвестно было), а ПОТОМ, после заполнения таблицы выставлял merge:

arg1:=wdCell; // тип OleVariant, разумеется, везде
arg2:=1; // Или сколько ячеек вправо - я думаю с выделением разберешься
for i:=0 to Length(MergeArr)-1 do begin
   t1.Cell(MergeArr[i].X,MergeArr[i].Y).Range.Select; // t1-таблица ворда
   WD.Selection.MoveEnd(arg1,arg2);
   WD.Selection.Cells.Merge;
  end;


Александр   (2009-05-27 12:58:00) [4]

KilkennyCat. Но тогда, если можно, ссылку на компонент.


KilkennyCat   (2009-05-27 12:54:00) [5]

Это понятно. С екселем не скажу, но отчет ворда вполне заменит ртф, ибо ртф легко читается вордом. Я, например, использую компонент EkRTF - легко, просто и быстро, на шаблонах.
С екселем можно работать нативно, у tmssoftware есть компонентик, но и он, и несколько других, что я пользовал, были тормознутые. Правда, это было несколько лет назад, может сейчас шустрее.
Но метод работы через офисные приложения - это, на мой взгляд, бяка. Хотя бы потому, что привязывается к офису.


Александр   (2009-05-27 12:40:00) [6]

KilkennyCat. Допустимо и в PL SQL выполнять по одному запросу и вручную заполнять таблицу в Word_е. Но это ведь абсурд. Так можно договориться и до калькуляторов, счётов и просто клочка бумаги с авторучкой. Задача как раз и стоит в том, чтобы автоматически заполнять таблицу в Word_е из базы данных. У меня большинство отчётов требуют выдавать в таблицах Word или Excel. Отчётов много, а исполнителей двое. Вручную не успеть.


KilkennyCat   (2009-05-27 12:23:00) [7]


> Можно, конечно выгрузить из базы в текстовый файл

Если это допустимо, то допустим и RTF.


Александр   (2009-05-27 12:00:00) [8]

MsGuns. Возможно. Но, если требуется готовый документ в Word_е? Можно, конечно выгрузить из базы в текстовый файл и вручную переносить в шаблон в Word, но получаемая таблица - это 5-15 листов. Долго придётся сидеть.


MsGuns   (2009-05-27 11:50:00) [9]

ИМХО, манера VBS при программировании на паскале - моветон ;)


Наверх

Титульная страница Поиск, карта сайта Написать письмо