From c065075c5f05c6974eddae350d9612ec948aabbb Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Thu, 28 Dec 2023 23:13:01 +0000 Subject: [PATCH] fpspreadsheet: Prepare ooxml chart reader/writer infrastructure. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9109 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/laz_fpspreadsheet.lpk | 6 +- .../source/common/fpsopendocument.pas | 10 +-- .../source/common/fpsopendocumentchart.pas | 6 +- .../fpspreadsheet/source/common/xlsxooxml.pas | 42 ++++++++- .../source/common/xlsxooxmlchart.pas | 88 +++++++++++++++++++ 5 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 components/fpspreadsheet/source/common/xlsxooxmlchart.pas diff --git a/components/fpspreadsheet/laz_fpspreadsheet.lpk b/components/fpspreadsheet/laz_fpspreadsheet.lpk index 073db68c6..85f07ff24 100644 --- a/components/fpspreadsheet/laz_fpspreadsheet.lpk +++ b/components/fpspreadsheet/laz_fpspreadsheet.lpk @@ -33,7 +33,7 @@ This package is all you need if you don't want graphical components (such as grids and charts)."/> - + @@ -309,6 +309,10 @@ This package is all you need if you don't want graphical components (such a + + + + diff --git a/components/fpspreadsheet/source/common/fpsopendocument.pas b/components/fpspreadsheet/source/common/fpsopendocument.pas index de3334ba3..37f985f53 100644 --- a/components/fpspreadsheet/source/common/fpsopendocument.pas +++ b/components/fpspreadsheet/source/common/fpsopendocument.pas @@ -41,16 +41,10 @@ uses Classes, SysUtils, laz2_xmlread, laz2_DOM, avglvltree, math, dateutils, contnrs, - {$IF FPC_FULLVERSION >= 20701} - zipper, - {$ELSE} - fpszipper, - {$ENDIF} + {$IFDEF FPS_PATCHED_ZIPPER} fpszipper, {$ELSE} zipper, {$ENDIF} fpstypes, fpsReaderWriter, fpsUtils, fpsHeaderFooterParser, fpsNumFormat, fpsXMLCommon, - {$IFDEF FPS_CHARTS} - fpsChart, - {$ENDIF} + {$IFDEF FPS_CHARTS} fpsChart, {$ENDIF} fpsPagelayout; type diff --git a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas index 23204c7d2..1ee0b20e9 100644 --- a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas +++ b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas @@ -9,10 +9,10 @@ interface uses Classes, SysUtils, StrUtils, Contnrs, FPImage, - {$IF FPC_FULLVERSION >= 20701} - zipper, - {$ELSE} + {$IFDEF FPS_PATCHED_ZIPPER} fpszipper, + {$ELSE} + zipper, {$ENDIF} laz2_xmlread, laz2_DOM, fpsTypes, fpSpreadsheet, fpsChart, fpsUtils, fpsNumFormat, diff --git a/components/fpspreadsheet/source/common/xlsxooxml.pas b/components/fpspreadsheet/source/common/xlsxooxml.pas index b4e58fd46..554b7d3c5 100644 --- a/components/fpspreadsheet/source/common/xlsxooxml.pas +++ b/components/fpspreadsheet/source/common/xlsxooxml.pas @@ -37,13 +37,16 @@ interface uses Classes, SysUtils, laz2_xmlread, laz2_DOM, avglvltree, - {$IFDEF FPS_PATCHED_ZIPPER} + {$ifdef FPS_PATCHED_ZIPPER} fpszipper, - {$ELSE} + {$else} zipper, - {$ENDIF} + {$endif} fpsTypes, fpsUtils, fpsReaderWriter, fpsNumFormat, fpsPalette, fpsConditionalFormat, + {$ifdef FPS_CHARTS} + fpsChart, + {$ENDIF} fpsxmlcommon, xlsCommon; type @@ -52,6 +55,9 @@ type TsSpreadOOXMLReader = class(TsSpreadXMLReader) private + {$ifdef FPS_CHARTS} + FChartReader: TsBasicSpreadChartReader; + {$endif} FDateMode: TDateMode; FPointSeparatorSettings: TFormatSettings; FSharedStrings: TStringList; @@ -155,6 +161,9 @@ type TsSpreadOOXMLWriter = class(TsCustomSpreadWriter) private + {$IFDEF FPS_CHARTS} + FChartWriter: TsBasicSpreadChartWriter; + {$ENDIF} FFirstNumFormatIndexInFile: Integer; vmlDrawingCounter: Integer; protected @@ -283,6 +292,7 @@ type public constructor Create(AWorkbook: TsBasicWorkbook); override; + destructor Destroy; override; { General writing methods } procedure WriteStringToFile(AFileName, AString: string); procedure WriteToStream(AStream: TStream; AParams: TsStreamParams = []); override; @@ -308,7 +318,9 @@ implementation uses variants, strutils, dateutils, math, lazutf8, LazFileUtils, uriparser, typinfo, {%H-}fpsPatches, fpSpreadsheet, fpsCrypto, fpsExprParser, - fpsStrings, fpsStreams, fpsClasses, fpsImages, fpsChart; + fpsStrings, fpsStreams, fpsClasses, + {$ifdef FPS_CHARTS}xlsxooxmlChart,{$endif} + fpsImages; const { OOXML general XML constants } @@ -830,6 +842,11 @@ end; constructor TsSpreadOOXMLReader.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); + + {$ifdef FPS_CHARTS} + FChartReader := TsSpreadOOXMLChartReader.Create(self); + {$endif} + FDateMode := XlsxSettings.DateMode; FSharedStrings := TStringList.Create; @@ -898,6 +915,10 @@ begin FPalette.Free; + {$ifdef FPS_CHARTS} + FChartReader.Free; + {$endif} + inherited Destroy; end; @@ -4629,6 +4650,10 @@ constructor TsSpreadOOXMLWriter.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); + {$ifdef FPS_CHARTS} + FChartWriter := TsSpreadOOXMLChartWriter.Create(self); + {$endif} + // Initial base date in case it won't be set otherwise. // Use 1900 to get a bit more range between 1900..1904. FDateMode := XlsxSettings.DateMode; @@ -4641,6 +4666,15 @@ begin end; +destructor TsSpreadOOXMLWriter.Destroy; +begin + {$ifdef FPS_CHARTS} + FChartWriter.Free; + {$endif} + inherited; +end; + + {@@ ---------------------------------------------------------------------------- Looks for the combination of border attributes of the given format record in the FBorderList and returns its index. diff --git a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas new file mode 100644 index 000000000..1d7aa9e74 --- /dev/null +++ b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas @@ -0,0 +1,88 @@ +unit xlsxooxmlChart; + +{$mode objfpc}{$H+} +{$include ..\fps.inc} + +interface + +{$ifdef FPS_CHARTS} + +uses + Classes, SysUtils, StrUtils, Contnrs, FPImage, + {$ifdef FPS_PATCHED_ZIPPER}fpszipper,{$else}zipper,{$endif} + laz2_xmlread, laz2_DOM, + fpsTypes, fpSpreadsheet, fpsChart, fpsUtils, fpsNumFormat, + fpsReaderWriter, fpsXMLCommon; + +type + + { TsSpreadOOXMLChartReader } + + TsSpreadOOXMLChartReader = class(TsBasicSpreadChartReader) + private + FPointSeparatorSettings: TFormatSettings; + + protected + + public + constructor Create(AReader: TsBasicSpreadReader); override; + destructor Destroy; override; + + end; + + TsSpreadOOXMLChartWriter = class(TsBasicSpreadChartWriter) + private + FPointSeparatorSettings: TFormatSettings; + + protected + + public + constructor Create(AWriter: TsBasicSpreadWriter); override; + destructor Destroy; override; + + end; + +{$ENDIF} + +implementation + +{$IFDEF FPS_CHARTS} + +uses + xlsxooxml; + +{ TsSpreadOOXMLChartReader } + +constructor TsSpreadOOXMLChartReader.Create(AReader: TsBasicSpreadReader); +begin + inherited Create(AReader); + + FPointSeparatorSettings := SysUtils.DefaultFormatSettings; + FPointSeparatorSettings.DecimalSeparator:='.'; +end; + +destructor TsSpreadOOXMLChartReader.Destroy; +begin + inherited; +end; + + +{ TsSpreadOOXMLChartWriter } + +constructor TsSpreadOOXMLChartWriter.Create(AWriter: TsBasicSpreadWriter); +begin + inherited Create(AWriter); + + FPointSeparatorSettings := SysUtils.DefaultFormatSettings; + FPointSeparatorSettings.DecimalSeparator:='.'; +end; + +destructor TsSpreadOOXMLChartWriter.Destroy; +begin + inherited; +end; + +{$ENDIF} + +end. +