From 552f841d181f26b0d0da8b542e31fceba09089f4 Mon Sep 17 00:00:00 2001 From: alexs75 Date: Tue, 20 Jun 2017 12:38:18 +0000 Subject: [PATCH] RxFPC:start work on export RxDBGrid groups to spreadsheet git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5949 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../demos/rxdbgrid/MergeCell/project1.lps | 29 +- .../rxdbgrid/RxDBGridGroupData/project1.lpi | 11 +- .../rxdbgrid/RxDBGridGroupData/project1.lpr | 6 +- .../rxdbgrid/RxDBGridGroupData/project1.lps | 250 +++++++++++------- .../rxdbgrid/RxDBGridGroupData/unit1.lfm | 26 ++ .../rxdbgrid/RxDBGridGroupData/unit1.pas | 14 +- components/rx/trunk/languages/rxdconst.es.po | 4 + components/rx/trunk/languages/rxdconst.po | 4 + components/rx/trunk/languages/rxdconst.ru.po | 6 +- components/rx/trunk/languages/rxdconst.uk.po | 4 + components/rx/trunk/rxdb/rxdbgrid.pas | 4 +- .../rxdbgridexportspreadsheet.pas | 121 ++++++++- .../rxdbgridexportspreadsheet_paramsunit.lfm | 24 +- .../rxdbgridexportspreadsheet_paramsunit.pas | 2 + components/rx/trunk/rxtools/rxdconst.pas | 1 + 15 files changed, 371 insertions(+), 135 deletions(-) diff --git a/components/rx/trunk/demos/rxdbgrid/MergeCell/project1.lps b/components/rx/trunk/demos/rxdbgrid/MergeCell/project1.lps index f69db466c..edcd08a9c 100644 --- a/components/rx/trunk/demos/rxdbgrid/MergeCell/project1.lps +++ b/components/rx/trunk/demos/rxdbgrid/MergeCell/project1.lps @@ -11,7 +11,7 @@ - + @@ -22,13 +22,13 @@ - + - + @@ -40,7 +40,7 @@ - + @@ -49,7 +49,7 @@ - + @@ -71,7 +71,7 @@ - + @@ -79,7 +79,7 @@ - + @@ -165,7 +165,8 @@ - + + @@ -184,7 +185,7 @@ - + @@ -194,19 +195,18 @@ - - + + - + - @@ -214,9 +214,8 @@ - - + diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpi b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpi index b3934251a..d65aa0adf 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpi +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpi @@ -21,16 +21,19 @@ - + - + - + - + + + + diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpr b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpr index 9ab48920c..46ba9062e 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpr +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lpr @@ -7,13 +7,17 @@ uses cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset - Forms, rxnew, Unit1 + Forms, + rxnew, + sysutils, + Unit1 { you can add units after this }; {$R *.res} begin RequireDerivedFormResource:=True; + DefaultFormatSettings.ThousandSeparator:=' '; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lps b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lps index 4e4189c49..7b3243edf 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lps +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/project1.lps @@ -3,15 +3,13 @@ - + - - - - + + @@ -20,25 +18,23 @@ - - - + + + - - - - - - + + + + + - - + @@ -47,59 +43,59 @@ - + - + - + - + - + - + - + - + - + - + @@ -107,70 +103,70 @@ - + - + - + - + - + - + - + - + - + - + @@ -178,7 +174,7 @@ - + @@ -186,7 +182,7 @@ - + @@ -194,160 +190,210 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + - + diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.lfm b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.lfm index e0cbaa2a0..813499fa2 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.lfm +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.lfm @@ -211,6 +211,21 @@ object Form1: TForm1 State = cbChecked TabOrder = 3 end + object Button1: TButton + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 682 + Height = 36 + Top = 6 + Width = 108 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Around = 6 + Caption = 'Export to ODS' + OnClick = Button1Click + TabOrder = 4 + end object rxData: TRxMemoryData FieldDefs = < item @@ -294,4 +309,15 @@ object Form1: TForm1 Left = 392 Top = 16 end + object RxDBGridExportSpreadSheet1: TRxDBGridExportSpreadSheet + RxDBGrid = RxDBGrid1 + Caption = 'Экспорт в электронную таблицу' + ShowSetupForm = True + FileName = 'test.ods' + PageName = 'test' + Options = [ressExportTitle, ressExportColors, ressExportFooter, ressExportFormula, ressOverwriteExisting, ressExportSelectedRows, ressHideZeroValues, ressColSpanning] + OpenAfterExport = True + Left = 392 + Top = 168 + end end diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.pas b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.pas index b960c8799..3d1008954 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.pas +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGridGroupData/unit1.pas @@ -5,14 +5,15 @@ unit Unit1; interface uses - Classes, SysUtils, FileUtil, rxdbgrid, rxmemds, Forms, Controls, Graphics, - Dialogs, StdCtrls, db; + Classes, SysUtils, FileUtil, rxdbgrid, rxmemds, RxDBGridExportSpreadSheet, + Forms, Controls, Graphics, Dialogs, StdCtrls, db; type { TForm1 } TForm1 = class(TForm) + Button1: TButton; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; @@ -24,6 +25,8 @@ type rxDataTEXT: TStringField; RxDBGrid1: TRxDBGrid; rxData: TRxMemoryData; + RxDBGridExportSpreadSheet1: TRxDBGridExportSpreadSheet; + procedure Button1Click(Sender: TObject); procedure CheckBox1Change(Sender: TObject); procedure FormCreate(Sender: TObject); private @@ -75,5 +78,12 @@ begin RxDBGrid1.ReadOnly:=CheckBox3.Checked; end; +procedure TForm1.Button1Click(Sender: TObject); +begin + RxDBGridExportSpreadSheet1.Options:=RxDBGridExportSpreadSheet1.Options + [ressExportGroupData]; + RxDBGridExportSpreadSheet1.Execute; + +end; + end. diff --git a/components/rx/trunk/languages/rxdconst.es.po b/components/rx/trunk/languages/rxdconst.es.po index 19c9cea3b..8d0a8b8ae 100644 --- a/components/rx/trunk/languages/rxdconst.es.po +++ b/components/rx/trunk/languages/rxdconst.es.po @@ -133,6 +133,10 @@ msgstr "Exportar nombre de archivo" msgid "Export footer formula" msgstr "Exportar fórmula de pie" +#: rxdconst.sexportgroupdata +msgid "Export group data" +msgstr "" + #: rxdconst.sexporthidezerovalues msgctxt "rxdconst.sexporthidezerovalues" msgid "Hide zero values" diff --git a/components/rx/trunk/languages/rxdconst.po b/components/rx/trunk/languages/rxdconst.po index 74bd4bcd7..a4414c638 100644 --- a/components/rx/trunk/languages/rxdconst.po +++ b/components/rx/trunk/languages/rxdconst.po @@ -127,6 +127,10 @@ msgstr "" msgid "Export footer formula" msgstr "" +#: rxdconst.sexportgroupdata +msgid "Export group data" +msgstr "" + #: rxdconst.sexporthidezerovalues msgctxt "rxdconst.sexporthidezerovalues" msgid "Hide zero values" diff --git a/components/rx/trunk/languages/rxdconst.ru.po b/components/rx/trunk/languages/rxdconst.ru.po index 9e3e9976f..a7167cb2e 100644 --- a/components/rx/trunk/languages/rxdconst.ru.po +++ b/components/rx/trunk/languages/rxdconst.ru.po @@ -137,9 +137,11 @@ msgstr "Имя файла экспорта" msgid "Export footer formula" msgstr "Экспортирововать формулы итоговой строки" +#: rxdconst.sexportgroupdata +msgid "Export group data" +msgstr "Экспорт данных группировки" + #: rxdconst.sexporthidezerovalues -#, fuzzy -msgctxt "rxdconst.sexporthidezerovalues" msgid "Hide zero values" msgstr "Не отображать нулевые значения" diff --git a/components/rx/trunk/languages/rxdconst.uk.po b/components/rx/trunk/languages/rxdconst.uk.po index 8baf1ff8c..7f44bf823 100644 --- a/components/rx/trunk/languages/rxdconst.uk.po +++ b/components/rx/trunk/languages/rxdconst.uk.po @@ -138,6 +138,10 @@ msgstr "Експортувати назву файлу" msgid "Export footer formula" msgstr "Експортувати підсумкову формулу" +#: rxdconst.sexportgroupdata +msgid "Export group data" +msgstr "" + #: rxdconst.sexporthidezerovalues #, fuzzy msgctxt "rxdconst.sexporthidezerovalues" diff --git a/components/rx/trunk/rxdb/rxdbgrid.pas b/components/rx/trunk/rxdb/rxdbgrid.pas index e65bf2170..5a20d5f40 100644 --- a/components/rx/trunk/rxdb/rxdbgrid.pas +++ b/components/rx/trunk/rxdb/rxdbgrid.pas @@ -522,7 +522,6 @@ type procedure SetActive(AValue: boolean); procedure SetColor(AValue: TColor); protected - function FindGroupItem(ARecBookMark: TBookMark): TColumnGroupItem; function AddGroupItem:TColumnGroupItem; procedure InitGroup; procedure DoneGroup; @@ -531,6 +530,7 @@ type destructor Destroy; override; procedure Clear; procedure UpdateValues; + function FindGroupItem(ARecBookMark: TBookMark): TColumnGroupItem; property GroupFieldName:string read FGroupFieldName write FGroupFieldName; published property Active:boolean read FActive write SetActive; @@ -780,7 +780,6 @@ type FSaveOnDataSetScrolled: TDataSetScrolledEvent; //Group data suppert FGroupItems:TColumnGroupItems; - FGroupItemDrawCur:TColumnGroupItem; procedure DoCreateJMenu; function GetColumns: TRxDbGridColumns; @@ -844,6 +843,7 @@ type protected FRxDbGridLookupComboEditor: TCustomControl; FRxDbGridDateEditor: TWinControl; + FGroupItemDrawCur:TColumnGroupItem; procedure CollumnSortListUpdate; procedure CollumnSortListClear; diff --git a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet.pas b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet.pas index d1b26b5f8..da23b5830 100644 --- a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet.pas +++ b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet.pas @@ -46,7 +46,8 @@ type ressOverwriteExisting, ressExportSelectedRows, ressHideZeroValues, - ressColSpanning + ressColSpanning, + ressExportGroupData ); TRxDBGridExportSpreadSheetOptions = set of TRxDBGridExportSpreadSheetOption; @@ -65,6 +66,7 @@ type procedure ExpCurRow(AFont: TFont); procedure ExpAllRow; procedure ExpSelectedRow; + procedure ExpGrpLine(G: TColumnGroupItem); protected FDataSet:TDataSet; FWorkbook: TsWorkbook; @@ -106,6 +108,9 @@ end; const ssAligns : array [TAlignment] of TsHorAlignment = (haLeft, haRight, haCenter); +type + THackRxDBGrid = class(TRxDBGrid); + { TRxDBGridExportSpeadSheet } function TRxDBGridExportSpreadSheet.ColIndex(ACol: TRxColumn): integer; @@ -132,6 +137,7 @@ var CT: TRxColumnTitle; S: String; CC: TColor; + G: TColumnGroupItem; begin FCurCol:=0; @@ -220,6 +226,14 @@ begin Inc(i); end; + + if RxDBGrid.GroupItems.Active and (ressExportGroupData in Options) then + begin + + THackRxDBGrid(RxDBGrid).FGroupItemDrawCur:=RxDBGrid.GroupItems.FindGroupItem(RxDBGrid.DataSource.DataSet.Bookmark); + if Assigned(THackRxDBGrid(RxDBGrid).FGroupItemDrawCur) then + ExpGrpLine(THackRxDBGrid(RxDBGrid).FGroupItemDrawCur); + end; end; procedure TRxDBGridExportSpreadSheet.ExpAllRow; @@ -253,6 +267,98 @@ begin F.Free; end; +procedure TRxDBGridExportSpreadSheet.ExpGrpLine(G: TColumnGroupItem); +var + C: TRxColumn; + +procedure OutGroupCellProps; +{$IFDEF OLD_fpSPREADSHEET} +var + scColor : TsColor; +{$ENDIF} +var + FColor: TColor; +begin + + if C.GroupParam.Color <> clNone then + FColor := C.GroupParam.Color + else + if RxDBGrid.GroupItems.Color <> clNone then + FColor := RxDBGrid.GroupItems.Color + else + FColor := clNone; + + if (FColor <> clNone) and (ressExportColors in FOptions) then + begin + {$IFDEF OLD_fpSPREADSHEET} + if (C.GroupParam.Color and SYS_COLOR_BASE) = 0 then + begin + scColor:=FWorkbook.AddColorToPalette(C.GroupParam.Color); + FWorksheet.WriteBackgroundColor(FCurRow,FCurCol, scColor);} + end; + {$ELSE} + FWorksheet.WriteBackgroundColor(FCurRow, FCurCol, FColor); + {$ENDIF} + end; + FWorksheet.WriteBorders(FCurRow, FCurCol, [cbNorth, cbWest, cbEast, cbSouth]); + FWorksheet.WriteBorderColor(FCurRow, FCurCol, cbNorth, scColorBlack); + FWorksheet.WriteBorderColor(FCurRow, FCurCol, cbWest, scColorBlack); + FWorksheet.WriteBorderColor(FCurRow, FCurCol, cbEast, scColorBlack); + FWorksheet.WriteBorderColor(FCurRow, FCurCol, cbSouth, scColorBlack); +end; + +procedure OutGroupCell(G: TColumnGroupItem); +var + D: Integer; + SF: String; +begin + if (C.GroupParam.ValueType <> fvtNon) then + begin +(* if (ressExportFormula in FOptions) and (Footer.ValueType in [fvtSum, fvtMax, fvtMin]) and (FFirstDataRow <= FLastDataRow) {and (Footer.DisplayFormat = '')} then + begin + D:=ColIndex(RxDBGrid.ColumnByFieldName(Footer.FieldName)); + + if D>=0 then + begin + case Footer.ValueType of + fvtSum:SF:='SUM'; + fvtMax:SF:='MIN'; + fvtMin:SF:='MAX'; + else + SF:='Error!('; + end; + + FWorksheet.WriteFormula(FCurRow, FCurCol, + Format('=%s(%s%d:%s%d)', [SF, GetColString(D), FFirstDataRow+1, GetColString(D), FLastDataRow+1])); + end + else + begin + FWorksheet.WriteNumber(FCurRow, FCurCol, Footer.NumericValue, nfFixed, 2); + end; + end + else *) + FWorksheet.WriteUTF8Text(FCurRow, FCurCol, C.GroupParam.DisplayText); + FWorksheet.WriteHorAlignment(FCurRow, FCurCol, ssAligns[C.GroupParam.Alignment]); + end; +end; + +var + i: Integer; +begin + inc(FCurRow); + FCurCol:=0; + for i:=0 to FRxDBGrid.Columns.Count - 1 do + begin + C:=FRxDBGrid.Columns[i] as TRxColumn; + if C.Visible then + begin + OutGroupCellProps; + OutGroupCell(G); + inc(FCurCol); + end; + end; +end; + procedure TRxDBGridExportSpreadSheet.DoExportTitle; var i, k : Integer; @@ -556,15 +662,24 @@ begin F.FileNameEdit1.FileName:=FFileName; F.cbOpenAfterExport.Checked:=FOpenAfterExport; F.cbExportColumnFooter.Checked:=ressExportFooter in FOptions; + F.cbExportColumnFooter.Enabled:=RxDBGrid.FooterOptions.Active; + F.cbExportColumnHeader.Checked:=ressExportTitle in FOptions; F.cbExportCellColors.Checked:=ressExportColors in FOptions; F.cbOverwriteExisting.Checked:=ressOverwriteExisting in FOptions; + F.cbExportFormula.Checked:=ressExportFormula in FOptions; + F.cbExportFormula.Enabled:=RxDBGrid.FooterOptions.Active; + F.cbExportSelectedRows.Checked:=ressExportSelectedRows in FOptions; F.cbExportSelectedRows.Enabled:=(dgMultiselect in RxDBGrid.Options) and (RxDBGrid.SelectedRows.Count > 0); F.cbHideZeroValues.Checked:=ressHideZeroValues in FOptions; + F.cbMergeCells.Checked:=ressColSpanning in FOptions; + F.cbExportGrpData.Checked:=ressExportGroupData in FOptions; + F.cbExportGrpData.Enabled:=RxDBGrid.GroupItems.Active; + F.edtPageName.Text:=FPageName; @@ -593,6 +708,10 @@ begin if F.cbMergeCells.Checked then FOptions:=FOptions + [ressColSpanning]; + + if F.cbExportGrpData.Checked then + FOptions:=FOptions + [ressExportGroupData]; + end; F.Free; end; diff --git a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.lfm b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.lfm index d76731db9..57c98421b 100644 --- a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.lfm +++ b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.lfm @@ -1,10 +1,10 @@ object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsForm Left = 483 - Height = 317 + Height = 328 Top = 235 Width = 548 Caption = 'Export params' - ClientHeight = 317 + ClientHeight = 328 ClientWidth = 548 OnCreate = FormCreate Position = poScreenCenter @@ -44,11 +44,11 @@ object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsFo end object Label3: TLabel AnchorSideLeft.Control = Label4 - AnchorSideTop.Control = cbHideZeroValues + AnchorSideTop.Control = cbExportGrpData AnchorSideTop.Side = asrBottom Left = 280 Height = 20 - Top = 165 + Top = 195 Width = 70 BorderSpacing.Around = 6 Caption = 'Page name' @@ -63,7 +63,7 @@ object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsFo AnchorSideRight.Side = asrBottom Left = 286 Height = 37 - Top = 191 + Top = 221 Width = 256 Anchors = [akTop, akLeft, akRight] BorderSpacing.Around = 6 @@ -96,7 +96,7 @@ object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsFo object ButtonPanel1: TButtonPanel Left = 6 Height = 46 - Top = 265 + Top = 276 Width = 536 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True @@ -203,4 +203,16 @@ object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsFo Caption = 'Merge cell''s' TabOrder = 11 end + object cbExportGrpData: TCheckBox + AnchorSideLeft.Control = Label4 + AnchorSideTop.Control = cbHideZeroValues + AnchorSideTop.Side = asrBottom + Left = 280 + Height = 24 + Top = 165 + Width = 139 + BorderSpacing.Around = 6 + Caption = 'Export group data' + TabOrder = 12 + end end diff --git a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.pas b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.pas index 1f971c73d..e537ccbae 100644 --- a/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.pas +++ b/components/rx/trunk/rxdbgrid_export_spreadsheet/rxdbgridexportspreadsheet_paramsunit.pas @@ -48,6 +48,7 @@ type cbExportSelectedRows: TCheckBox; cbExportFormula: TCheckBox; cbExportColumnFooter: TCheckBox; + cbExportGrpData: TCheckBox; cbMergeCells: TCheckBox; cbOpenAfterExport: TCheckBox; cbExportColumnHeader: TCheckBox; @@ -87,6 +88,7 @@ begin cbExportSelectedRows.Caption:=sExportSelectedRows; cbHideZeroValues.Caption:=sExportHideZeroValues; cbMergeCells.Caption:=sMergeCells; + cbExportGrpData.Caption:=sExportGroupData; end; end. diff --git a/components/rx/trunk/rxtools/rxdconst.pas b/components/rx/trunk/rxtools/rxdconst.pas index 271f98611..4fbf3f76c 100644 --- a/components/rx/trunk/rxtools/rxdconst.pas +++ b/components/rx/trunk/rxtools/rxdconst.pas @@ -188,6 +188,7 @@ resourcestring sExportSelectedRows = 'Export only selected rows'; sExportHideZeroValues = 'Hide zero values'; sMergeCells = 'Merge cell''s'; + sExportGroupData = 'Export group data'; sOverwriteExisting = 'Overwrite existing'; sShowColumnHeaderOnAllPage = 'Show column header on all pages'; sPageMargins = 'Page margins';