Экспортировать DBGrid в HTML

=== Экспортировать DBGrid в HTML ===
type
 TGridToHTMLOption = (ghWithHeaders);
 TGridToHTMLOptions = set of TGridToHTMLOption;
function DBGridToHTML(Grid : TDBGrid;
 ExportOptions: TGridToHTMLOptions): String;
const
 HTMLStart =
 '< !DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.0 Transitional//EN" > '#13 +
 '< HTML> '#13 +
 '< HEAD> < META http-equiv=Content-Type content=" text/html; charset=windows-1251" > '#13 +
 '< STYLE> '#13 +
 'BODY {'#13 +
 ' BACKGROUND: white;'#13 +
 ' COLOR: black;'#13 +
 ' FONT-FAMILY: arial;'#13 +
 ' FONT-SIZE: 8pt;'#13 +
 ' VERTICAL-ALIGN: top'#13 +
 '}'#13 +
 'TABLE {'#13 +
 ' BACKGROUND: white;'#13 +
 ' BORDER-BOTTOM: silver 0px solid;'#13 +
 ' BORDER-LEFT: silver 1px solid;'#13 +
 ' BORDER-RIGHT: silver 0px solid;'#13 +
 ' BORDER-TOP: silver 1px solid;'#13 +
 ' FONT-FAMILY: arial;'#13 +
 ' FONT-SIZE: 8pt;'#13 +
 ' FONT-WEIGHT: normal;'#13 +
 '}'#13 +
 'TD {'#13 +
 ' BORDER-BOTTOM: silver 1px solid;'#13 +
 ' BORDER-LEFT: silver 0px solid;'#13 +
 ' BORDER-RIGHT: silver 1px solid;'#13 +
 ' BORDER-TOP: silver 0px solid;'#13 +
 ' VERTICAL-ALIGN: top;'#13 +
 ' TEXT-ALIGN: left;'#13 +
 '}'#13 +
 'TD.grid {'#13 +
 ' TEXT-ALIGN: left;'#13 +
 '}'#13 +
 'TD.gridr {'#13 +
 ' TEXT-ALIGN: right;'#13 +
 '}'#13 +
 'TD.gridc {'#13 +
 ' TEXT-ALIGN: center;'#13 +
 '}'#13 +
 'TH {'#13 +
 ' BACKGROUND: silver;'#13 +
 ' BORDER-BOTTOM: gray 1px solid;'#13 +
 ' BORDER-LEFT: gray 0px solid;'#13 +
 ' BORDER-RIGHT: gray 1px solid;'#13 +
 ' BORDER-TOP: gray 0px solid;'#13 +
 ' FONT-WEIGHT: bold;'#13 +
 '}'#13 +
 'TH.grid {'#13 +
 ' TEXT-ALIGN: left;'#13 +
 '}'#13 +
 'TH.gridr {'#13 +
 ' TEXT-ALIGN: right;'#13 +
 '}'#13 +
 'TH.gridc {'#13 +
 ' TEXT-ALIGN: center;'#13 +
 '}'#13 +
 '< /STYLE> '#13 +
 '< TITLE> Печать таблицы< /TITLE> '#13 +
 '< /HEAD> '#13 +
 '< BODY> '#13;
 HTMLEnd = '< /BODY> < /HTML> ';
 TableStart = '< TABLE WIDTH=" 100%" CELLSPACING=0 CELLPADDING=1> '#13;
 TableEnd = '< /TABLE> '#13;
 HeaderRowStart = '< TR> '#13;
 HeaderRowEnd = '< /TR> '#13;
 BodyRowStart = '< TR> '#13;
 BodyRowEnd = '< /TR> '#13;
const
 StyleNames: array [TAlignment] of String = ('grid', 'gridr', 'gridc');
 function TD(Column: TColumn; IsTitle: Boolean; Widht: Integer): String;
 var
 S: String;
 Align: TAlignment;
 Tag: String;
 begin
 if IsTitle then begin
 Tag := 'TH';
 Align := Column.Title.Alignment;
 S := StyleNames[Align];
 end else begin
 Tag := 'TD';
 Align := Column.Alignment;
 if Align = taLeftJustify then begin
 if (Column.Field is TBCDField) or
 (Column.Field is TCurrencyField) then
 Align := taRightJustify;
 if (Column.Field is TBooleanField) then
 Align := taCenter;
 end;
 S := StyleNames[Align];
 if (Column.Field is TBCDField) or (Column.Field is TIntegerField) then
 S := S + ' NOWRAP'
 end;
 if Widht > 0 then
 S := S + Format(' WIDTH=" %d%%" ', [Widht]);
 Result := '< ' + Tag + ' class=' + S + '> ';
 if IsTitle then begin
 S := Column.Title.Caption
 end else begin
 if Column.Field is TBooleanField then
 with TBooleanField(Column.Field) do begin
 if Length(DisplayValues) = 0 then begin
 if AsBoolean then
 S := 'да'
 else
 S := 'нет';
 end else
 S := Column.Field.DisplayText;
 end else
 S := Column.Field.DisplayText;
 end;
 if Length(Trim(S)) = 0 then
 S := ' ';
 Result := Result + S + '< /' + Tag + '> '#13;
 end;
var
 BM: String;
 I: Integer;
 Widhts: array of Integer;
 TotalWidht: Integer;
begin
 Result := ;
 with Grid do
 begin
 if Assigned(DataSource)
 and Assigned(DataSource.DataSet)
 and DataSource.DataSet.Active then
 begin
 with DataSource.DataSet do
 begin
 DisableControls;
 BM := BookMark;
 SetLength(Widhts, Columns.Count);
 TotalWidht := 0;
 for I := 0 to Pred(Columns.Count) do
 begin
 if Assigned(Columns[I].Field) then
 begin
 Widhts[I] := Columns[I].Width;
 Inc(TotalWidht, Widhts[I]);
 end;
 end;
 end;
 for I := 0 to High(Widhts) do
 begin
 Widhts[I] := Widhts[I] * 100 div TotalWidht;
 end;
 Result := HTMLStart;
 Result := Result + TableStart;
 if (ghWithHeaders in ExportOptions) then
 begin
 Result := Result + HeaderRowStart;
 for I := 0 to Pred(Columns.Count) do
 begin
 if Assigned(Columns.Items[I].Field) then
 begin
 Result := Result + TD(Columns.Items[I], TRUE, Widhts[I]);
 end;
 end;
 Result := Result + HeaderRowEnd;
 end;
 First;
 while not Eof do
 begin
 Result := Result + BodyRowStart;
 for I := 0 to Pred(Columns.Count) do
 begin
 if Assigned(Columns.Items[I].Field) then
 begin
 Result := Result + TD(Columns.Items[I], FALSE, -1{Integer(Widhts[Index]});
 end;
 end;
 Result := Result + BodyRowEnd;
 Next;
 end;
 Result := Result + TableEnd + HTMLEnd;
 BookMark := BM;
 EnableControls;
 end;
 end;
end;
ID: 03067
Category:Базы данных
Category:DBGrid