Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Отчет в Word. Где ошибка?   Найти похожие ветки 

 
Ученик2   (2004-03-07 15:51) [0]

Пытаюсь разобраться как построить отчет в Word"е.
procedure TForm1.N1Word1Click(Sender: TObject);
var
Direction: OleVariant;
Tabl1 : OleVariant;
i : integer;
vWidth : array [1..4] of OleVariant;
bm : OleVariant;
n : longint;
begin
WordApplication1 := TWordApplication.Create(self); //создание экз.сервера
WordApplication1.ConnectKind := ckNewInstance; //всегда созд.новый документ
WordApplication1.AutoQuit := true; //при заверш.приложения сервер автоматически завершит работу
WordDocument1 := TWordDocument.Create(self);
WordFont1 := TWordFont.Create(self);
WordParagraphFormat1 := TWordParagraphFormat.Create(self);

 begin
 WordApplication1.Disconnect;
 WordApplication1.Connect;
 WordApplication1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
 WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
 // отключение орфографии
 WordApplication1.Options.CheckSpellingAsYouType := false;
 WordApplication1.Options.CheckGrammarAsYouType := false;
    with WordApplication1.ActiveDocument.PageSetup do
    begin
    //установка параметров страницы
   Orientation  := wdOrientPortrait;//wdOrientLandscape;
   TopMargin    := WordApplication1.CentimetersToPoints(1.5); //поле сверху
   BottomMargin := WordApplication1.CentimetersToPoints(2);  // поле снизу
   LeftMargin   := WordApplication1.CentimetersToPoints(2.5); // поле слева
   RightMargin  := WordApplication1.CentimetersToPoints(1);   // поле справа
   end;
 end;
 WordApplication1.Selection.InsertAfter(" "+#13);
 WordApplication1.Selection.InsertAfter("Список лиц, "+#13);
 WordApplication1.Selection.InsertAfter("подтвердивших квалификацию мастера "+#13);
 WordApplication1.Selection.InsertAfter("за период с "+Form1.DateEdit3.Text+" г. по "+Form1.DateEdit4.Text+" г."+#13);

 WordFont1.ConnectTo(WordApplication1.Selection.Font);
 WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
 WordFont1.Bold := 1;
 WordFont1.Size := 14;
 WordParagraphFormat1.Alignment := wdAlignParagraphCenter;
 WordApplication1.Selection.Collapse(Direction); //снятие выделения

//создаем таблицу
 Tabl1 := WordDocument1.Tables.Add(WordDocument1.Range, 1, 4, EmptyParam, EmptyParam);
 vWidth[1] := 20;   vWidth[2] := 35;
 vWidth[3] := 45;   vWidth[4] := 90;
   for i := 1 to 4 do
    begin
   // установка размеров ячеек
    Tabl1.Columns.Item(i).Width := Roundto(2.54*vWidth[i],0);
   // выравнивание по центру по вертикали и по горизонтали
    Tabl1.Cell(1, i).VerticalAlignment := wdCellAlignVerticalCenter;
    Tabl1.Cell(2, i).VerticalAlignment := wdCellAlignVerticalCenter;
 end;
 Tabl1.Cell(1, 1).Range.Text := "Дата";
 Tabl1.Cell(1, 2).Range.Text := "Подразделение";
 Tabl1.Cell(1, 3).Range.Text := "в\звание";
 Tabl1.Cell(1, 4).Range.Text := "Фамилия ИО;

 Tabl1.Range.Font.Size := 10;
 i := 1;
 Table1.First;
 for n := 0 to Table1.RecordCount-1 do
   begin
   Tabl1.Rows.Add(EmptyParam);
   if Table1["Data"]<> NULL then Tabl1.Cell(i+1, 1).Range.Text :=Table1["Data"] else begin
      Tabl1.Cell(i+1, 1).Range.Text := "";
      end;
   if Table1.FieldByName("Dep").AsString = "" then Tabl1.Cell(i+1, 2).Range.Text := "" else begin
      Tabl1.Cell(i+1, 2).Range.Text := Table1["Dep"];
      end;
   if Table1["Zv"]<> NULL then Tabl1.Cell(i+1, 3).Range.Text := Table1["Zv"] else begin
      Tabl1.Cell(i+1, 3).Range.Text := "";
      end;
   Tabl1.Cell(i+1, 4).Range.Text := Table1["FulName"];
   inc(i);
   Table1.Next;
   end;
  i :=1;
 WordDocument1.Tables.Item(i).Cell(1,1).Select;
 WordApplication1.Selection.Font.Bold :=1;
 WordDocument1.Tables.Item(i).Cell(1,2).Select;
 WordApplication1.Selection.Font.Bold :=1;
 WordDocument1.Tables.Item(i).Cell(1,3).Select;
 WordApplication1.Selection.Font.Bold :=1;
 WordDocument1.Tables.Item(i).Cell(1,4).Select;
 WordApplication1.Selection.Font.Bold :=1;
 Direction := wdCollapseEnd;
 WordApplication1.Selection.Collapse(Direction); //снятие выделения

WordApplication1.Visible := true;
WordApplication1.Disconnect;
end;

Формируется только таблица, текста перед таблицей нет. Если закоментировать код, относящийся к созданию таблицы, то текст передается в Word. В противном случае таблица создается на месте текста. Где ошибка?


 
YurikGl ©   (2004-03-07 16:10) [1]

Честно говоря, всегда делал так:

 DSwap.First;
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter("&#207;&#238;&#231;&#232;&#246;&#232;&#255;"+#9+"&#206;&#225; &#238;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;"+#9+"&#208;&#229;&#228;&#224;&#234;&#246;&#232;&#255;"+#9+"&#205; &#224;&#232;&#236;&#229;&#237;&#238;&#226;&#224;&#237;&#232;&#229;"+#9+"&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242; &#226;&#238;");
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF2.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
if DSwap.RecordCount>0 then begin
 Repeat
 if DSwap.Fields[0].value=null then st:=""
                               else st:=DSwap.Fields[0].value;
 if DSwap.Fields[2].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[2].value;
 if DSwap.Fields[3].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[3].value;
 if DSwap.Fields[4].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[4].value;
 if DSwap.Fields[5].value=null then st:=st+#9+""
                               else st:=st+#9+IntToStr(DSwap.Fields[5].value);

 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(ConvertString(st)+#13);
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
 DSwap.Next;
 until DSwap.Eof;
                           end  else begin
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(""+#9+""+#9+""+#9+""+#9+"");
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6

                            end;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(1).Width:=round(1.76*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(2).Width:=round(3.53*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Width:=round(2.47*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(4).Width:=round(5.68*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Width:=round(2.25*100000/3527);
 TableLineSet;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;

Т.е. сначала создаю строку, разделенную табуляцией, потом говорю ConvertTable. Тормоза, конечно, но работает.


 
Ученик2   (2004-03-07 16:29) [2]

За пример спасибо.
Здесь тоже данные передаются из НД. А как перед этим вставить текст, чтобы таблица не наложилась на него?


 
YurikGl ©   (2004-03-07 16:49) [3]

Ладно, выкладываю всю процедуру (правда, слегка другую, но структура у них одинакова). Извини, комментариев нет а русский язык, слегка глючит.

Процедура формирует запрос на основе переменной Stat, потом делает заголовок (переменная capt). Далее шапка таблицы+ConvertTable, строчки+ConvertTable. Если строчек в DataSet нет, то добавляется пустая строчка.

Procedure SborkaExport(Stat,Capt:string);
Begin

DSwap.Active:=false;
DSwap.CommandText:="Select [&#200;&#229;&#240;&#224;&#240;&#245;&#232;&#247;&#229;&#241;&#234;&#224;&#255; &#241;&#226;&#255;&#231;&#252;].&#239;&#238;&#231;&#232;&#246;&#232;&#255;,[&#199;&#224;&#239;&#240;&#238;&#241;&#209;&# 225;&#238;&#240;&#234;&#232;].&#200;&#241;&#239;&#238;&#235;&#237;&#229;&#237;&#232;&#229;,[&#199;&#224;&#239;&#240;&#23 8;&#241;&#209;&#225;&#238;&#240;&#234;&#232;].&#206;&#225;&#238;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;,[&#199; &#224;&#239;&#240;&#238;&#241;&#209;&#225;&#238;&#240;&#234;&#232;].&#208;&#229;&#228;&#224;&#234;&#246;&#232;&#255;, [&#199;&#224;&#239;&#240;&#238;&#241;&#209;&#225;&#238;&#240;&#234;&#232;].&#205;&#224;&#232;&#236;&#229;&#237;&#238;&#2 26;&#224;&#237;&#232;&#229;, [&#200;&#229;&#240;&#224;&#240;&#245;&#232;&#247;&#229;&#241;&#234;&#224;&#255; &#241;&#226;&#255;&#231;&#252;].&#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; From [&#200;&#229;&#240;&#224;&#240;&#245;&#232;&#247;&#229;&#241;&#234;&#224;&#255; &#241;&#226;&#255;&#231;&#252;],[&#199;&#224;&#239;&#240;&#238;&#241;&#209;&#225;&#238;&#240;&#234;&#232;] where"+
"[&#199;&#224;&#239;&#240;&#238;&#241;&#209;&#225;&#238;&#240;&#234;&#232;].[ID&#209;&#225;&#238;&#240;&#234;&#232;]=[&# 200;&#229;&#240;&#224;&#240;&#245;&#232;&#247;&#229;&#241;&#234;&#224;&#255; &#241;&#226;&#255;&#231;&#252;].[Id&#209;&#225;&#238;&#240;&#234;&#232;&#196;&#238;&#247;&#229;&#240;&#237;&#232;&#233;]  and [&#199;&#224;&#239;&#240;&#238;&#241;&#209;&#225;&#238;&#240;&#234;&#232;].&#209;&#242;&#224;&#242;&#243;&#241;="+#39+St at+#39+" and [&#200;&#229;&#240;&#224;&#240;&#245;&#232;&#247;&#229;&#241;&#234;&#224;&#255; &#241;&#226;&#255;&#231;&#252;].Id&#209;&#225;&#238;&#240;&#234;&#232;&#208;&#238;&#228;&#232;&#242;&#229;&#235;&#252;=" +IntToStr(DataModule1.ADODataSetSborkiAll.Fields[0].Value);
 W1.ActiveDocument.Paragraphs.Add(EmptyParam);
 inc(par);
DSwap.Active:=true;
dswap.Sort:="&#239;&#238;&#231;&#232;&#246;&#232;&#255;";
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(Capt+#13);
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF1.Duplicate;
 W1.Selection.ParagraphFormat.KeepWithNext:=-1;
 W1.Selection.ParagraphFormat.SpaceAfter:=14;
 inc(par);
 inc(tabl);
 DSwap.First;
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter("&#207;&#238;&#231;&#232;&#246;&#232;&#255;"+#9+"&#206;&#225; &#238;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;"+#9+"&#208;&#229;&#228;&#224;&#234;&#246;&#232;&#255;"+#9+"&#205; &#224;&#232;&#236;&#229;&#237;&#238;&#226;&#224;&#237;&#232;&#229;"+#9+"&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242; &#226;&#238;");
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF2.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
if DSwap.RecordCount>0 then begin
 Repeat
 if DSwap.Fields[0].value=null then st:=""
                               else st:=DSwap.Fields[0].value;
 if DSwap.Fields[2].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[2].value;
 if DSwap.Fields[3].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[3].value;
 if DSwap.Fields[4].value=null then st:=st+#9+""
                               else st:=st+#9+DSwap.Fields[4].value;
 if DSwap.Fields[5].value=null then st:=st+#9+""
                               else st:=st+#9+IntToStr(DSwap.Fields[5].value);

 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(ConvertString(st)+#13);
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
 DSwap.Next;
 until DSwap.Eof;
                           end  else begin
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(""+#9+""+#9+""+#9+""+#9+"");
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6

                            end;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(1).Width:=round(1.76*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(2).Width:=round(3.53*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Width:=round(2.47*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(4).Width:=round(5.68*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Width:=round(2.25*100000/3527);
 TableLineSet;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;

 W1.Selection.ParagraphFormat.KeepWithNext:=-1;
End;

Function ConvertString(i:string):string;
Begin
while pos("-",i)>0 do
 i[pos("-",i)]:="­";
 ConvertString:=i;

End;

Переменные tabl и par глобальные. С помощью этой процедуры подставляя различные значения я создаю во word несколько таблиц подряд.

   par:=1;
   tabl:=0;

   if CheckBox2.Checked then SborkaExport("&#196;&#229;&#242;&#224;&#235;&#252;","&#196;&#229;&#242;&#224;&#235;&#232;");
   if CheckBox3.Checked then SborkaExport("&#202;&#238;&#236;&#239;&#235;&#229;&#234;&#242;","&#202;&#238;&#236;&#239;&#235;&#229;&#234;&#242;&#251;" );
   if CheckBox4.Checked then SborkaExport("&#209;&#225;&#238;&#240;&#234;&#224;","&#209;&#225;&#238;&#240;&#234;&#232;");


 
YurikGl ©   (2004-03-07 16:52) [4]

Строчка
W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(Capt+#13) - название таблицы


 
Ученик2   (2004-03-07 17:04) [5]

Спасибо, пытаюсь разобраться



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.038 c
14-1077900040
Giemgo
2004-02-27 19:40
2004.03.28
Пароль на USB


3-1078117698
MVA
2004-03-01 08:08
2004.03.28
Фильтрация


1-1078469313
WondeRu
2004-03-05 09:48
2004.03.28
ShellExecute "кушает" память))


1-1078382310
girich
2004-03-04 09:38
2004.03.28
Вопрос по TServiceApplication (события OnCreate и OnStart).


1-1078944197
Mishenka
2004-03-10 21:43
2004.03.28
Курсор мыши в StringGrid???