📄 dbgridehimpexp.pas
字号:
Result := FontTblList.IndexOf(FontName);
if Result = -1 then
Result := FontTblList.Add(FontName);
end;
function TDBGridEhExportAsRTF.GetColorIndex(Color: TColor): Integer;
var RGBColor: Longint;
s: String;
begin
RGBColor := ColorToRGB(Color);
s := Format('%3d%3d%3d', [GetRValue(RGBColor), GetGValue(RGBColor), GetBValue(RGBColor)]);
Result := ColorTblList.IndexOf(s);
if Result = -1 then
Result := ColorTblList.Add(s);
end;
procedure TDBGridEhExportAsRTF.WritePrefix;
begin
end;
procedure TDBGridEhExportAsRTF.WriteSuffix;
begin
Put('}');
end;
procedure TDBGridEhExportAsRTF.WriteTitle(ColumnsList: TColumnsEhList);
var fLogPelsX: Integer;
i, w, k: Integer;
FPTitleExpArr: TTitleExpArr;
ListOfHeadTreeNodeList: TList;
ColSpan, RowSpan: Integer;
Text: String;
LeftBorder, TopBorder, BottomBorder, RightBorder: Boolean;
ExclLeftBorders, ExclTopBorders, ExclBottomBorders, ExclRightBorders: TStringList;
Space: String;
procedure AddExclBorders(Col, Row, ColSpan, RowSpan: Integer);
var i, k: Integer;
begin
for i := Col to Col + ColSpan - 1 do
for k := Row downto Row - RowSpan + 1 do
begin
if i <> Col then
ExclLeftBorders.Add(Format('%3d%3d', [i, k]));
if i <> Col + ColSpan - 1 then
ExclRightBorders.Add(Format('%3d%3d', [i, k]));
if k <> Row then
ExclTopBorders.Add(Format('%3d%3d', [i, k]));
if k <> Row - RowSpan + 1 then
ExclBottomBorders.Add(Format('%3d%3d', [i, k]));
end;
end;
procedure CalcBorders(Col, Row: Integer);
begin
LeftBorder := True; TopBorder := True;
BottomBorder := True; RightBorder := True;
if ExclLeftBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
LeftBorder := False;
if ExclRightBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
RightBorder := False;
if ExclTopBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
TopBorder := False;
if ExclBottomBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
BottomBorder := False;
end;
begin
fLogPelsX := GetDeviceCaps(DBGridEh.Canvas.Handle, LOGPIXELSX);
if DBGridEh.UseMultiTitle then
begin
Space := IntToStr(Abs(Trunc(DBGridEh.VTitleMargin / 2 / fLogPelsX * 1440 - 20)));
ExclLeftBorders := nil; ExclTopBorders := nil;
ExclBottomBorders := nil; ExclRightBorders := nil;
try
CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
ExclLeftBorders := TStringList.Create;
ExclTopBorders := TStringList.Create;
ExclBottomBorders := TStringList.Create;
ExclRightBorders := TStringList.Create;
//MultiTitle
for k := ListOfHeadTreeNodeList.Count - 1 downto 1 do
begin
Put('\trowd');
PutL('\trgaph40');
w := 0;
for i := 0 to ColumnsList.Count - 1 do
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, k, i, ColSpan, RowSpan);
AddExclBorders(i, k, ColSpan, RowSpan);
CalcBorders(i, k);
WriteCellBorder(LeftBorder, TopBorder, BottomBorder, RightBorder);
Inc(w, Trunc(ColumnsList[i].Width / fLogPelsX * 1440)); // in twips
Put('\clshdng10000\clcfpat' + IntToStr(GetColorIndex((DBGridEh.FixedColor))));
PutL('\cellx' + IntToStr(w));
end;
PutL('{\trrh0');
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]) <> nil then
begin
Text := THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]).Text;
Put('\pard\intbl{' + GetAlignment(taCenter) + '\sb' + Space + '\sa' + Space);
end else
begin
Text := '';
Put('\pard\intbl{' + GetAlignment(taCenter));
end;
PutText(DBGridEh.TitleFont, Text, DBGridEh.FixedColor);
PutL('\cell}');
end;
PutL('\pard\intbl\row}');
end;
//Bottomest titles
Put('\trowd');
PutL('\trgaph40');
w := 0;
for i := 0 to ColumnsList.Count - 1 do
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
AddExclBorders(i, 0, ColSpan, RowSpan);
CalcBorders(i, 0);
WriteCellBorder(LeftBorder, TopBorder, BottomBorder, RightBorder);
Inc(w, Trunc(ColumnsList[i].Width / fLogPelsX * 1440)); // in twips
Put('\clshdng10000\clcfpat' + IntToStr(GetColorIndex((ColumnsList[i].Title.Color))));
PutL('\cellx' + IntToStr(w));
end;
PutL('{\trrh0');
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]) <> nil then
begin
Text := THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]).Text;
Put('\pard\intbl{' + GetAlignment(taCenter) + '\sb' + Space + '\sa' + Space);
end else
begin
Text := '';
Put('\pard\intbl{' + GetAlignment(taCenter));
end;
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
PutText(ColumnsList[i].Title.Font, Text, ColumnsList[i].Title.Color);
PutL('\cell}');
end;
PutL('\pard\intbl\row}');
finally
for i := 0 to ListOfHeadTreeNodeList.Count - 1 do
TList(ListOfHeadTreeNodeList.Items[i]).Free;
ListOfHeadTreeNodeList.Free;
// FreeMem(FPTitleExpArr);
ExclLeftBorders.Free;
ExclTopBorders.Free;
ExclBottomBorders.Free;
ExclRightBorders.Free;
end;
end else
begin
Put('\trowd');
PutL('\trgaph40');
w := 0;
for i := 0 to ColumnsList.Count - 1 do
begin
WriteCellBorder(True, True, True, True);
Inc(w, Trunc(ColumnsList[i].Width / fLogPelsX * 1440)); // in twips
Put('\clshdng10000\clcfpat' + IntToStr(GetColorIndex((ColumnsList[i].Title.Color))));
PutL('\cellx' + IntToStr(w));
end;
PutL('{\trrh0');
for i := 0 to ColumnsList.Count - 1 do
begin
if DBGridEh.Flat then Space := '12' else Space := '24';
Put('\pard\intbl{' + GetAlignment(ColumnsList[i].Title.Alignment) + '\sb' + Space + '\sa' + Space);
PutText(ColumnsList[i].Title.Font, ColumnsList[i].Title.Caption, ColumnsList[i].Title.Color);
PutL('\cell}');
end;
PutL('\pard\intbl\row}');
end;
end;
procedure TDBGridEhExportAsRTF.WriteRecord(ColumnsList: TColumnsEhList);
var fLogPelsX: Integer;
i, w: Integer;
begin
Put('\trowd');
PutL('\trgaph40');
fLogPelsX := GetDeviceCaps(DBGridEh.Canvas.Handle, LOGPIXELSX);
w := 0;
for i := 0 to ColumnsList.Count - 1 do
begin
WriteCellBorder(True, True, True, True);
Inc(w, Trunc(ColumnsList[i].Width / fLogPelsX * 1440)); // in twips
Put('\clshdng10000\clcfpat' + IntToStr(GetColorIndex(GetDataCellColor(ColumnsList, i))));
PutL('\cellx' + IntToStr(w));
end;
PutL('{\trrh0');
inherited WriteRecord(ColumnsList);
PutL('\pard\intbl\row}');
end;
procedure TDBGridEhExportAsRTF.WriteDataCell(Column: TColumnEh; FColCellParamsEh: TColCellParamsEh);
var Space: String;
begin
if DBGridEh.Flat then Space := '12' else Space := '24';
Put('\pard\intbl{' + GetAlignment(FColCellParamsEh.Alignment) + '\sb' + Space + '\sa' + Space);
PutText(FColCellParamsEh.Font, FColCellParamsEh.Text, FColCellParamsEh.Background);
PutL('\cell}');
end;
procedure TDBGridEhExportAsRTF.WriteCellBorder(LeftBorder, TopBorder, BottomBorder, RightBorder: Boolean);
begin
if LeftBorder then
begin
Put('\clbrdrl');
Put('\brdrs');
PutL('\brdrcf0');
end;
if TopBorder then
begin
Put('\clbrdrt');
Put('\brdrs');
PutL('\brdrcf0');
end;
if BottomBorder then
begin
Put('\clbrdrb');
Put('\brdrs');
PutL('\brdrcf0');
end;
if RightBorder then
begin
Put('\clbrdrr');
Put('\brdrs');
PutL('\brdrcf0');
end;
end;
procedure TDBGridEhExportAsRTF.WriteFooter(ColumnsList: TColumnsEhList;
FooterNo: Integer);
var fLogPelsX: Integer;
i, w: Integer;
begin
Put('\trowd');
PutL('\trgaph40');
fLogPelsX := GetDeviceCaps(DBGridEh.Canvas.Handle, LOGPIXELSX);
w := 0;
for i := 0 to ColumnsList.Count - 1 do
begin
WriteCellBorder(True, True, True, True);
Inc(w, Trunc(ColumnsList[i].Width / fLogPelsX * 1440)); // in twips
Put('\clshdng10000\clcfpat' +
IntToStr(GetColorIndex(GetFooterCellColor(ColumnsList, i, FooterNo))));
PutL('\cellx' + IntToStr(w));
end;
PutL('{\trrh0'); // row auto-height
inherited WriteFooter(ColumnsList, FooterNo);
PutL('\pard\intbl\row}');
end;
procedure TDBGridEhExportAsRTF.WriteFooterCell(DataCol, Row: Integer;
Column: TColumnEh; AFont: TFont; Background: TColor;
Alignment: TAlignment; Text: String);
var Space: String;
begin
if DBGridEh.Flat then Space := '12' else Space := '24';
Put('\pard\intbl{' + GetAlignment(Alignment) + '\sb' + Space + '\sa' + Space);
PutText(AFont, Text, Background);
PutL('\cell}');
end;
function TDBGridEhExportAsRTF.GetDataCellColor(ColumnsList: TColumnsEhList;
ColIndex: Integer): TColor;
var Font: TFont;
State: TGridDrawState;
begin
Font := TFont.Create;
try
Font.Assign(ColumnsList[ColIndex].Font);
Result := ColumnsList[ColIndex].Color;
State := [];
if Assigned(DBGridEh.OnGetCellParams) then
DBGridEh.OnGetCellParams(DBGridEh, ColumnsList[ColIndex], Font, Result, State);
finally
Font.Free;
end;
end;
function TDBGridEhExportAsRTF.GetFooterCellColor(
ColumnsList: TColumnsEhList; ColIndex: Integer; FooterNo: Integer): TColor;
var Font: TFont;
State: TGridDrawState;
Alignment: TAlignment;
Value: String;
begin
Font := TFont.Create;
try
Font.Assign(ColumnsList[ColIndex].UsedFooter(FooterNo).Font);
Result := ColumnsList[ColIndex].UsedFooter(FooterNo).Color;
Alignment := ColumnsList[ColIndex].UsedFooter(FooterNo).Alignment;
if ColumnsList[ColIndex].UsedFooter(FooterNo).ValueType in [fvtSum, fvtCount] then
Value := GetFooterValue(FooterNo, ColIndex)
else
Value := DBGridEh.GetFooterValue(FooterNo, ColumnsList[ColIndex]);
State := [];
if Assigned(DBGridEh.OnGetFooterParams) then
DBGridEh.OnGetFooterParams(DBGridEh, ColumnsList[ColIndex].Index, FooterNo,
ColumnsList[ColIndex], Font, Result, Alignment, State, Value);
finally
Font.Free;
end;
end;
{ TDBGridEhExportAsXLS }
procedure StreamWriteWordArray(Stream: TStream; wr: array of Word);
var
i: Integer;
begin
for i := 0 to Length(wr)-1 do
{$IFDEF CIL}
Stream.Write(wr[i]);
{$ELSE}
Stream.Write(wr[i], SizeOf(wr[i]));
{$ENDIF}
end;
procedure StreamWriteAnsiString(Stream: TStream; S: String);
{$IFDEF CIL}
var
b: TBytes;
{$ENDIF}
begin
{$IFDEF CIL}
b := BytesOf(AnsiString(S));
Stream.Write(b, Length(b));
{$ELSE}
Stream.Write(PChar(S)^, Length(S));
{$ENDIF}
end;
var
CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
CXlsEof: array[0..1] of Word = ($0A, 00);
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
procedure TDBGridEhExportAsXLS.WriteBlankCell;
begin
CXlsBlank[2] := FRow;
CXlsBlank[3] := FCol;
StreamWriteWordArray(Stream, CXlsBlank);
// Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
IncColRow;
end;
procedure TDBGridEhExportAsXLS.WriteFloatCell(const AValue: Double);
begin
CXlsNumber[2] := FRow;
CXlsNumber[3] := FCol;
StreamWriteWordArray(Stream, CXlsNumber);
// Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
Stream.WriteBuffer(AValue, 8);
IncColRow;
end;
procedure TDBGridEhExportAsXLS.WriteIntegerCell(const AValue: Integer);
var
V: Integer;
begin
CXlsRk[2] := FRow;
CXlsRk[3] := FCol;
StreamWriteWordArray(Stream, CXlsRk);
// Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
V := (AValue shl 2) or 2;
Stream.WriteBuffer(V, 4);
IncColRow;
end;
procedure TDBGridEhExportAsXLS.WriteStringCell(const AValue: string);
var
L: Word;
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L;
StreamWriteWordArra
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -