Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Отчет в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.027 c
4-1073984926
Андрю-ХА
2004-01-13 12:08
2004.03.28
Контекстное меню


14-1077350919
Igor_thief
2004-02-21 11:08
2004.03.28
Какой способ самый оптимальный?


3-1074854331
vantage10
2004-01-23 13:38
2004.03.28
QuickReport отображение CheckBox


1-1078416763
AlexLine
2004-03-04 19:12
2004.03.28
Загрузка изображиний в TImage


14-1077960542
Morfey
2004-02-28 12:29
2004.03.28
Как изменить анкету???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский