git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.FastReport@13 475b051d-3a53-6940-addd-820bf0cfe0d7
309 lines
8.1 KiB
ObjectPascal
309 lines
8.1 KiB
ObjectPascal
|
|
{******************************************}
|
|
{ }
|
|
{ FastReport v4.0 }
|
|
{ CSV export }
|
|
{ }
|
|
{ Copyright (c) 1998-2007 }
|
|
{ by Alexander Fediachov, }
|
|
{ Fast Reports Inc. }
|
|
{ }
|
|
{******************************************}
|
|
|
|
unit frxExportCSV;
|
|
|
|
interface
|
|
|
|
{$I frx.inc}
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, extctrls, frxClass, frxExportMatrix, ShellAPI
|
|
{$IFDEF Delphi6}, Variants {$ENDIF};
|
|
|
|
type
|
|
TfrxCSVExportDialog = class(TForm)
|
|
OkB: TButton;
|
|
CancelB: TButton;
|
|
SaveDialog1: TSaveDialog;
|
|
GroupPageRange: TGroupBox;
|
|
DescrL: TLabel;
|
|
AllRB: TRadioButton;
|
|
CurPageRB: TRadioButton;
|
|
PageNumbersRB: TRadioButton;
|
|
PageNumbersE: TEdit;
|
|
GroupQuality: TGroupBox;
|
|
OpenCB: TCheckBox;
|
|
OEMCB: TCheckBox;
|
|
SeparatorLB: TLabel;
|
|
SeparatorE: TEdit;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure PageNumbersEChange(Sender: TObject);
|
|
procedure PageNumbersEKeyPress(Sender: TObject; var Key: Char);
|
|
procedure FormKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
end;
|
|
|
|
TfrxCSVExport = class(TfrxCustomExportFilter)
|
|
private
|
|
FMatrix: TfrxIEMatrix;
|
|
FOpenAfterExport: Boolean;
|
|
Exp: TStream;
|
|
FPage: TfrxReportPage;
|
|
FOEM: Boolean;
|
|
FSeparator: String;
|
|
procedure ExportPage(Stream: TStream);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
class function GetDescription: String; override;
|
|
function ShowModal: TModalResult; override;
|
|
function Start: Boolean; override;
|
|
procedure Finish; override;
|
|
procedure FinishPage(Page: TfrxReportPage; Index: Integer); override;
|
|
procedure StartPage(Page: TfrxReportPage; Index: Integer); override;
|
|
procedure ExportObject(Obj: TfrxComponent); override;
|
|
published
|
|
property Separator: String read FSeparator write FSeparator;
|
|
property OEMCodepage: Boolean read FOEM write FOEM;
|
|
property OpenAfterExport: Boolean read FOpenAfterExport write FOpenAfterExport default False;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses frxUtils, frxFileUtils, frxUnicodeUtils, frxRes, frxrcExports;
|
|
|
|
{$R *.dfm}
|
|
|
|
{ TfrxCSVExport }
|
|
|
|
constructor TfrxCSVExport.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FOEM := False;
|
|
FSeparator := ';';
|
|
FilterDesc := frxGet(8851);
|
|
DefaultExt := frxGet(8852);
|
|
end;
|
|
|
|
class function TfrxCSVExport.GetDescription: String;
|
|
begin
|
|
Result := frxResources.Get('CSVExport');
|
|
end;
|
|
|
|
procedure TfrxCSVExport.ExportPage(Stream: TStream);
|
|
var
|
|
x, y, i: Integer;
|
|
Obj: TfrxIEMObject;
|
|
s: String;
|
|
|
|
function StrToOem(const AnsiStr: String): String;
|
|
begin
|
|
SetLength(Result, Length(AnsiStr));
|
|
if Length(Result) > 0 then
|
|
CharToOemBuff(PChar(AnsiStr), PChar(Result), Length(Result));
|
|
end;
|
|
|
|
function PrepareString(const Str: String): String;
|
|
begin
|
|
if FOEM then
|
|
Result := StrToOem(Str)
|
|
else
|
|
Result := Str;
|
|
Result := '"' + StringReplace(Result, #13#10, '', [rfReplaceAll]) + '"';
|
|
end;
|
|
|
|
begin
|
|
FMatrix.Prepare;
|
|
|
|
for y := 0 to FMatrix.Height - 2 do
|
|
begin
|
|
for x := 0 to FMatrix.Width - 1 do
|
|
begin
|
|
i := FMatrix.GetCell(x, y);
|
|
if (i <> -1) then
|
|
begin
|
|
Obj := FMatrix.GetObjectById(i);
|
|
if Obj.Counter = 0 then
|
|
begin
|
|
s := PrepareString(Obj.Memo.Text) + FSeparator;
|
|
Stream.Write(s[1], Length(s));
|
|
Obj.Counter := 1;
|
|
end
|
|
else begin
|
|
s := FSeparator;
|
|
Stream.Write(s[1], Length(s));
|
|
end;
|
|
end;
|
|
end;
|
|
Stream.Write(#13#10, 2);
|
|
end;
|
|
|
|
end;
|
|
|
|
function TfrxCSVExport.ShowModal: TModalResult;
|
|
begin
|
|
if not Assigned(Stream) then
|
|
begin
|
|
with TfrxCSVExportDialog.Create(nil) do
|
|
begin
|
|
OpenCB.Visible := not SlaveExport;
|
|
if SlaveExport then
|
|
FOpenAfterExport := False;
|
|
|
|
if (FileName = '') and (not SlaveExport) then
|
|
SaveDialog1.FileName := ChangeFileExt(ExtractFileName(frxUnixPath2WinPath(Report.FileName)), SaveDialog1.DefaultExt)
|
|
else
|
|
SaveDialog1.FileName := FileName;
|
|
|
|
OpenCB.Checked := FOpenAfterExport;
|
|
OEMCB.Checked := FOEM;
|
|
SeparatorE.Text := FSeparator;
|
|
|
|
if PageNumbers <> '' then
|
|
begin
|
|
PageNumbersE.Text := PageNumbers;
|
|
PageNumbersRB.Checked := True;
|
|
end;
|
|
|
|
Result := ShowModal;
|
|
|
|
if Result = mrOk then
|
|
begin
|
|
PageNumbers := '';
|
|
CurPage := False;
|
|
if CurPageRB.Checked then
|
|
CurPage := True
|
|
else if PageNumbersRB.Checked then
|
|
PageNumbers := PageNumbersE.Text;
|
|
|
|
FOpenAfterExport := OpenCB.Checked;
|
|
FOEM := OEMCB.Checked;
|
|
FSeparator := SeparatorE.Text;
|
|
|
|
if not SlaveExport then
|
|
begin
|
|
if DefaultPath <> '' then
|
|
SaveDialog1.InitialDir := DefaultPath;
|
|
if SaveDialog1.Execute then
|
|
FileName := SaveDialog1.FileName
|
|
else
|
|
Result := mrCancel;
|
|
end
|
|
else
|
|
FileName := ChangeFileExt(GetTempFile, SaveDialog1.DefaultExt);
|
|
end;
|
|
Free;
|
|
end;
|
|
end else
|
|
Result := mrOk;
|
|
end;
|
|
|
|
function TfrxCSVExport.Start: Boolean;
|
|
begin
|
|
if (FileName <> '') or Assigned(Stream) then
|
|
begin
|
|
if (ExtractFilePath(FileName) = '') and (DefaultPath <> '') then
|
|
FileName := DefaultPath + '\' + FileName;
|
|
FMatrix := TfrxIEMatrix.Create(UseFileCache, Report.EngineOptions.TempDir);
|
|
FMatrix.Background := False;
|
|
FMatrix.BackgroundImage := False;
|
|
FMatrix.Printable := ExportNotPrintable;
|
|
FMatrix.RichText := True;
|
|
FMatrix.PlainRich := True;
|
|
FMatrix.AreaFill := False;
|
|
FMatrix.CropAreaFill := True;
|
|
FMatrix.Inaccuracy := 5;
|
|
FMatrix.DeleteHTMLTags := True;
|
|
FMatrix.Images := False;
|
|
FMatrix.WrapText := True;
|
|
FMatrix.ShowProgress := False;
|
|
FMatrix.FramesOptimization := True;
|
|
try
|
|
if Assigned(Stream) then
|
|
Exp := Stream
|
|
else
|
|
Exp := TFileStream.Create(FileName, fmCreate);
|
|
Result := True;
|
|
except
|
|
Result := False;
|
|
end;
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TfrxCSVExport.StartPage(Page: TfrxReportPage; Index: Integer);
|
|
begin
|
|
FMatrix.Clear;
|
|
end;
|
|
|
|
procedure TfrxCSVExport.ExportObject(Obj: TfrxComponent);
|
|
begin
|
|
if Obj is TfrxView then
|
|
FMatrix.AddObject(TfrxView(Obj));
|
|
end;
|
|
|
|
procedure TfrxCSVExport.FinishPage(Page: TfrxReportPage; Index: Integer);
|
|
begin
|
|
FPage := Page;
|
|
ExportPage(Exp);
|
|
end;
|
|
|
|
procedure TfrxCSVExport.Finish;
|
|
begin
|
|
FMatrix.Free;
|
|
if not Assigned(Stream) then
|
|
Exp.Free;
|
|
if FOpenAfterExport and (not Assigned(Stream)) then
|
|
ShellExecute(GetDesktopWindow, 'open', PChar(FileName), nil, nil, SW_SHOW);
|
|
end;
|
|
|
|
{ TfrxCSVExportDialog }
|
|
|
|
procedure TfrxCSVExportDialog.FormCreate(Sender: TObject);
|
|
begin
|
|
Caption := frxGet(8850);
|
|
OkB.Caption := frxGet(1);
|
|
CancelB.Caption := frxGet(2);
|
|
GroupPageRange.Caption := frxGet(7);
|
|
AllRB.Caption := frxGet(3);
|
|
CurPageRB.Caption := frxGet(4);
|
|
PageNumbersRB.Caption := frxGet(5);
|
|
DescrL.Caption := frxGet(9);
|
|
GroupQuality.Caption := frxGet(8302);
|
|
OEMCB.Caption := frxGet(8304);
|
|
OpenCB.Caption := frxGet(8706);
|
|
SaveDialog1.Filter := frxGet(8851);
|
|
SaveDialog1.DefaultExt := frxGet(8852);
|
|
SeparatorLB.Caption := frxGet(8853);
|
|
|
|
if UseRightToLeftAlignment then
|
|
FlipChildren(True);
|
|
end;
|
|
|
|
procedure TfrxCSVExportDialog.PageNumbersEChange(Sender: TObject);
|
|
begin
|
|
PageNumbersRB.Checked := True;
|
|
end;
|
|
|
|
procedure TfrxCSVExportDialog.PageNumbersEKeyPress(Sender: TObject;
|
|
var Key: Char);
|
|
begin
|
|
case key of
|
|
'0'..'9':;
|
|
#8, '-', ',':;
|
|
else
|
|
key := #0;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrxCSVExportDialog.FormKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
begin
|
|
if Key = VK_F1 then
|
|
frxResources.Help(Self);
|
|
end;
|
|
|
|
end.
|