From e8e00456d3ed6836e2aa72988e119bcf3f52f2a5 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 16 Jan 2024 22:39:27 +0000 Subject: [PATCH] fpspreadsheet: More support of series data labels in xlsx reader. Bubble series shows bubble size in proportion to area now. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9146 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpschart/fpschartlink/chart_demo.lpi | 5 -- .../fpspreadsheet/source/common/fpschart.pas | 4 ++ .../source/common/fpsopendocumentchart.pas | 5 +- .../source/common/xlsxooxmlchart.pas | 58 ++++++++++--------- .../source/visual/fpspreadsheetchart.pas | 5 +- 5 files changed, 43 insertions(+), 34 deletions(-) diff --git a/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/chart_demo.lpi b/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/chart_demo.lpi index 8d6bdd549..fde4d3a8e 100644 --- a/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/chart_demo.lpi +++ b/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/chart_demo.lpi @@ -69,11 +69,6 @@ - - - - - diff --git a/components/fpspreadsheet/source/common/fpschart.pas b/components/fpspreadsheet/source/common/fpschart.pas index 2f51b951b..141c7caa0 100644 --- a/components/fpspreadsheet/source/common/fpschart.pas +++ b/components/fpspreadsheet/source/common/fpschart.pas @@ -649,15 +649,19 @@ type property ShowSymbols; end; + TsBubbleSizeMode = (bsmRadius, bsmArea); + TsBubbleSeries = class(TsCustomScatterSeries) private FBubbleRange: TsChartRange; + FBubbleSizeMode: TsBubbleSizeMode; public constructor Create(AChart: TsChart); override; destructor Destroy; override; procedure SetBubbleRange(ARow1, ACol1, ARow2, ACol2: Cardinal); procedure SetBubbleRange(ASheet1: String; ARow1, ACol1: Cardinal; ASheet2: String; ARow2, ACol2: Cardinal); property BubbleRange: TsChartRange read FBubbleRange; + property BubbleSizeMode: TsBubbleSizeMode read FBubbleSizeMode write FBubbleSizeMode; end; TsStockSeries = class(TsCustomScatterSeries) diff --git a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas index 286442523..a8cc6f438 100644 --- a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas +++ b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas @@ -1456,7 +1456,10 @@ begin end else if (series is TsBubbleSeries) then - ReadChartCellRange(ANode, 'chart:values-cell-range-address', TsBubbleSeries(series).BubbleRange) + begin + TsBubbleSeries(series).BubbleSizeMode := bsmArea; + ReadChartCellRange(ANode, 'chart:values-cell-range-address', TsBubbleSeries(series).BubbleRange); + end else ReadChartCellRange(ANode, 'chart:values-cell-range-address', series.YRange); diff --git a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas index 83f9f5e44..18590fb8a 100644 --- a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas +++ b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas @@ -167,6 +167,11 @@ begin begin nodeName := ANode.NodeName; case nodeName of + 'c:ser': + begin + ser := TsAreaSeries.Create(AChart); + ReadChartSeriesProps(ANode.FirstChild, ser); + end; 'c:grouping': begin s := GetAttrValue(ANode, 'val'); @@ -177,11 +182,6 @@ begin end; 'c:varyColors': ; - 'c:ser': - begin - ser := TsAreaSeries.Create(AChart); - ReadChartSeriesProps(ANode.FirstChild, ser); - end; 'c:dLbls': ; 'c:axId': @@ -340,6 +340,11 @@ begin begin nodeName := ANode.NodeName; case nodeName of + 'c:ser': + begin + ser := TsBarSeries.Create(AChart); + ReadChartSeriesProps(ANode.FirstChild, ser); + end; 'c:barDir': begin s := GetAttrValue(ANode, 'val'); @@ -358,11 +363,6 @@ begin end; 'c:varyColors': ; - 'c:ser': - begin - ser := TsBarSeries.Create(AChart); - ReadChartSeriesProps(ANode.FirstChild, ser); - end; 'c:dLbls': s := ''; 'c:gapWidth': @@ -412,14 +412,15 @@ begin nodeName := ANode.NodeName; s := GetAttrValue(ANode, 'val'); case nodeName of - 'c:bubbleScale': ; - 'c:showNegBubbles': ; - 'c:varyColors': ; 'c:ser': begin ser := TsBubbleSeries.Create(AChart); + ser.BubbleSizeMode := bsmArea; // Excel always plots the area of the bubbles ReadChartSeriesProps(ANode.FirstChild, ser); end; + 'c:bubbleScale': ; + 'c:showNegBubbles': ; + 'c:varyColors': ; 'c:dLbls': ; 'c:axId': @@ -830,6 +831,12 @@ begin begin nodeName := ANode.NodeName; case nodeName of + 'c:ser': + begin + ser := TsLineSeries.Create(AChart); + ReadChartSeriesMarker(ANode.FirstChild, TsLineSeries(ser)); + ReadChartSeriesProps(ANode.FirstChild, ser); + end; 'c:grouping': begin s := GetAttrValue(ANode, 'val'); @@ -840,12 +847,6 @@ begin end; 'c:varyColors': ; - 'c:ser': - begin - ser := TsLineSeries.Create(AChart); - ReadChartSeriesMarker(ANode.FirstChild, TsLineSeries(ser)); - ReadChartSeriesProps(ANode.FirstChild, ser); - end; 'c:dLbls': ; 'c:gapWidth': @@ -1078,18 +1079,18 @@ begin begin nodeName := ANode.NodeName; case nodeName of - 'c:scatterStyle': - begin - s := GetAttrValue(ANode, 'val'); - smooth := (s = 'smoothMarker'); // to do: use it to create a spline series when true. - end; - 'c:varyColors': ; 'c:ser': begin ser := TsScatterSeries.Create(AChart); ReadChartSeriesMarker(ANode.FirstChild, TsScatterSeries(ser)); ReadChartSeriesProps(ANode.FirstChild, ser); end; + 'c:scatterStyle': + begin + s := GetAttrValue(ANode, 'val'); + smooth := (s = 'smoothMarker'); // to do: use it to create a spline series when true. + end; + 'c:varyColors': ; 'c:dLbls': ; 'c:axId': @@ -1282,6 +1283,8 @@ begin end; end; end; + 'c:dlblPos': + ; 'c:showLegendKey': if (s <> '') and (s <> '0') then ASeries.DataLabels := ASeries.DataLabels + [cdlSymbol]; @@ -1298,7 +1301,8 @@ begin if (s <> '') and (s <> '0') then ASeries.DataLabels := ASeries.DataLabels + [cdlPercentage]; 'c:showBubbleSize': - ; + if (s <> '') and (s <> '0') and (ASeries is TsBubbleSeries) then + ASeries.DataLabels := ASeries.DataLabels + [cdlValue]; 'c:showLeaderLines': ; 'c:extLst': @@ -1340,7 +1344,7 @@ begin 'c:spPr': ReadChartFillAndLineProps(ANode.FirstChild, ASeries.Chart, ASeries.Fill, ASeries.Line); 'c:dLbls': - ReadChartSeriesLabels(ANode.Firstchild, ASeries); + ReadChartSeriesLabels(ANode.FirstChild, ASeries); 'c:trendline': ReadChartSeriesTrendLine(ANode.FirstChild, ASeries); 'c:errBars': diff --git a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas index 5f1d7171e..f9bc1d72e 100644 --- a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas +++ b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas @@ -1839,7 +1839,10 @@ begin AChartSeries.Transparency := round(255*AWorkbookSeries.Fill.Transparency); {$IF LCL_FullVersion >= 3990000} - AChartSeries.BubbleRadiusUnits := bruPercentage; + case AWorkbookSeries.BubbleSizeMode of + bsmRadius: AChartSeries.BubbleRadiusUnits := bruPercentageRadius; + bsmArea: AChartSeries.BubbleRadiusUnits := bruPercentageArea; + end; AChartSeries.ParentChart.ExpandPercentage := 10; {$IFEND}