Я измучился весь уже с этим долбаным Word-ом. Чтоб я еще раз его использовал. Требуется создать отчет в Word-е. Для этого пользователь выбирает необходимые поля. Далбше дело алгоритма. Но вот не могу понять в чем глюк. Вот код:
| Код | begin if DM.IBDatabase1.Connected then try IsOk:=False; Report:=TFReport.Create(nil); if pcDataType.ActivePageIndex=0 then case PageControlData.ActivePageIndex of 0:Grid:=DBGrid; 1:Grid:=DBGrid1; 2:Grid:=DBGrid2; 3:Grid:=DBGrid5; 4:Grid:=DBGrid7; end; for i:=0 to Grid.Columns.Count-1 do with Report do begin clbFields.Items.Add(Grid.Columns.Items[i].Title.Caption); clbFields.Checked[clbFields.Items.Count-1]:=True; end; Report.clbFields.Items.Add('Ýìáëåìà'); Report.clbFields.Checked[Report.clbFields.Items.Count-1]:=True; Report.RecordsCount:=GetRecordsCount(PageControlData.ActivePageIndex); Report.ShowModal; IsOk:=Report.btnOk.ModalResult=mrOk; if IsOk then begin RecCount:=Report.RecordsCount; SetLength(RecNumbers,Length(Report.RecNumbers)); CopyMemory(RecNumbers,Report.RecNumbers,Length(Report.RecNumbers)*SizeOf(integer)); Setlength(ColumnUsed,Report.clbFields.Items.Count); CopyMemory(ColumnUsed,Report.ColumnUsed,Report.clbFields.Items.Count*SizeOf(Boolean)); end; finally FreeAndNil(Report); end else ShowMessage('Äëÿ ñîñòàâëåíèÿ îò÷åòà íåîáõîäèìî ïîäêëþ÷èòüñÿ ê áàçå äàííûõ');
if not IsOk then Exit;
MaxValue:=0; Counter:=0; ColumnCount:=0; ProgressCount:=0;
for j:=0 to Length(RecNumbers)-1 do if MaxValue<RecNumbers[j] then begin MaxValue:=RecNumbers[j]; Inc(ProgressCount); end; try Progress:=TFProgress.Create(nil); Progress.glLabel2.Caption:='Èäåò ñîñòàâëåíèå îò÷åòà...'; Progress.Show;
AppProgID:='Word.Application'; Result:=GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown); if Result=MK_E_UNAVAILABLE then Word:=CreateOleObject(AppProgID) else Word:=GetActiveOleObject(AppProgID);
for i:=0 to 5 do if ColumnUsed[i] then begin TitleString:=Grid.Columns[i].Title.Caption; SaveId:=i+1; Inc(ColumnCount); break; end;
for i:=SaveID to 5 do if ColumnUsed[i] then begin TitleString:=TitleString+';'+Grid.Columns[i].Title.Caption; Inc(ColumnCount); end;
Word.Documents.Add; Doc:=Word.Documents.Item(1); Doc.Paragraphs.Add; Doc.Paragraphs.Item(1).Style:='Çàãîëîâîê 1'; Range:=Doc.Range(0); Range.InsertBefore('Îò÷åò'); //Doc.Paragraphs.Add; Range.Font.Bold:=1; //Table:=Range.ConvertToTable(';',Counter,ColumnCount); try // Word.Visible:=True; EnableWindow(Handle,False); DM.DataSource1.DataSet.First; //wd.Range.Cells. Range.Font.Bold:=0; for i:=1 to RecCount do begin Progress.glProgress1.Percent:=Round((100/MaxValue)*i); if i>MaxValue then Break; for j:=0 to Length(RecNumbers) do if RecNumbers[j]=i then begin for n:=0 to 5 do if ColumnUsed[n] then begin RecString:=DM.DataSource1.DataSet.FieldByName(Rec1CFields[n]).AsString; SaveID:=n+1; break; end; for m:=SaveID to 5 do if ColumnUsed[m] then begin RecString:=RecString+';'+DM.DataSource1.DataSet.FieldByName(Rec1CFields[m]).AsString; //ShowMessage(DM.DataSource1.DataSet.FieldByName(Rec1CFields[m]).AsString); end; Doc.Paragraphs.Add; Range.InsertAfter(TitleString); Doc.Paragraphs.Add; Range.InsertAfter(RecString); Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start, Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);
Table:=Range.ConvertToTable(';',2,ColumnCount);
CurrentWidth:=0; RecString:=''; WidthsCounter:=1; Counter:=0; for z:=6 to ActiveMainGrid.Columns.Count-1 do if ColumnUsed[z] then if CurrentWidth+ActiveMainGrid.Columns[z].Width<480 then begin RecString:=DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString; TitleString2:=ActiveMainGrid.Columns[z].Title.Caption; CurrentWidth:=ActiveMainGrid.Columns[z].Width; SaveID:=z+1; SetLength(Widths,1); Widths[0]:=ActiveMainGrid.Columns[z].Width; Break; end else begin ShowMessage('Ñòîëáåö '+ActiveMainGrid.Columns[z].Title.Caption+' èìååò ñëèøêîì áîëüøèå ðàçìåðû. Èçìåíèòå èõ è íà÷íèòå îò÷åò ñíîâà'); Exit; end;
for z:=SaveID to ActiveMainGrid.Columns.Count-1 do if ColumnUsed[z] then if CurrentWidth+ActiveMainGrid.Columns[z].Width<480 then begin RecString:=RecString+';'+DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString; TitleString2:=TitleString2+';'+ActiveMainGrid.Columns[z].Title.Caption; CurrentWidth:=CurrentWidth+ActiveMainGrid.Columns[z].Width; Inc(WidthsCounter); SetLength(Widths,WidthsCounter); Widths[WidthsCounter-1]:=ActiveMainGrid.Columns[z].Width; end else begin{В случае большого количества столбцов, часть переносится} Range.InsertAfter(TitleString2); Doc.Paragraphs.Add; Range.InsertAfter(RecString); Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start, Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End); Table:=Range.ConvertToTable(';',2,WidthsCounter); TitleString2:=ActiveMainGrid.Columns[z].Title.Caption; RecString:=DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString; WidthsCounter:=0; CurrentWidth:=0; end; Range.InsertAfter(TitleString2);
Doc.Paragraphs.Add; Range.InsertAfter(RecString);
Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start, Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);
Table:=Range.ConvertToTable(';',2,WidthsCounter);
Break; end; Application.ProcessMessages; DM.DataSource1.DataSet.Next; end;
..... .... .... ..... .... |
Код практически еще не оптимизирован, так что не обращайте внимания если будут какие либо глупости. Но вот я ни как не могу понять в чем ошибка. При выводе в Word инфы и при очень большом количестве столбцов( в коде помечен этот участок) резульат для меня совсем не понятный. Названия столбцов переносятся на следующую строку и получается такая чушь, что разобрать ни чего не возможно. Буду признателен всем, кто поможет разобраться в данной проблеме. |