![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с таблицами в 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 при программировании на паскале - моветон ;)