Форум: "Основная";
Текущий архив: 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("Ïîçèöèÿ"+#9+"Îá îçíà÷åíèå"+#9+"Ðåäàêöèÿ"+#9+"Í àèìåíîâàíèå"+#9+"Êîëè÷åñò âî");
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 [Èåðàðõè÷åñêàÿ ñâÿçü].ïîçèöèÿ,[ÇàïðîñÑ&# 225;îðêè].Èñïîëíåíèå,[Çàïð 8;ñÑáîðêè].Îáîçíà÷åíèå,[Ç àïðîñÑáîðêè].Ðåäàêöèÿ, [ÇàïðîñÑáîðêè].Íàèìåíî 26;àíèå, [Èåðàðõè÷åñêàÿ ñâÿçü].êîëè÷åñòâî From [Èåðàðõè÷åñêàÿ ñâÿçü],[ÇàïðîñÑáîðêè] where"+
"[ÇàïðîñÑáîðêè].[IDÑáîðêè]=[&# 200;åðàðõè÷åñêàÿ ñâÿçü].[IdÑáîðêèÄî÷åðíèé] and [ÇàïðîñÑáîðêè].Ñòàòóñ="+#39+St at+#39+" and [Èåðàðõè÷åñêàÿ ñâÿçü].IdÑáîðêèÐîäèòåëü=" +IntToStr(DataModule1.ADODataSetSborkiAll.Fields[0].Value);
W1.ActiveDocument.Paragraphs.Add(EmptyParam);
inc(par);
DSwap.Active:=true;
dswap.Sort:="ïîçèöèÿ";
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("Ïîçèöèÿ"+#9+"Îá îçíà÷åíèå"+#9+"Ðåäàêöèÿ"+#9+"Í àèìåíîâàíèå"+#9+"Êîëè÷åñò âî");
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("Äåòàëü","Äåòàëè");
if CheckBox3.Checked then SborkaExport("Êîìïëåêò","Êîìïëåêòû" );
if CheckBox4.Checked then SborkaExport("Ñáîðêà","Ñáîðêè");
← →
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.033 c