fpspreadsheet: Support/fix reading/writing of ring series in both ods and xlsx

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9220 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-02-06 23:21:56 +00:00
parent 5f781b622a
commit 775bca202a
11 changed files with 199 additions and 122 deletions

View File

@ -24,8 +24,8 @@ var
sheet: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
fn: String;
stackMode: TsChartStackMode = csmSideBySide;
dir, fn: String;
stackMode: TsChartStackMode = csmDefault;
rotated: Boolean = false;
i: Integer;
begin
@ -43,21 +43,25 @@ begin
'stacked':
stackMode := csmStacked;
'side-by-side':
stackMode := csmSideBySide;
stackMode := csmDefault;
'percent-stacked', 'stacked-percent', 'percentstacked', 'stackedpercent', 'percentage', 'percent':
stackMode := csmStackedPercentage;
end;
case rotated of
false: fn := fn + '_vert';
true: fn := fn + '_horiz';
false: fn := fn + '-vert';
true: fn := fn + '-horiz';
end;
case stackMode of
csmSideBySide: ;
csmStacked: fn := fn + '_stacked';
csmStackedPercentage: fn := fn + '_stackedPercent';
csmDefault: ;
csmStacked: fn := fn + '-stacked';
csmStackedPercentage: fn := fn + '-stackedpercent';
end;
dir := ExtractFilePath(ParamStr(0)) + 'files/';
ForceDirectories(dir);
fn := dir + fn;
book := TsWorkbook.Create;
try
// worksheet

View File

@ -11,12 +11,19 @@ const
sDISTANCE = 'Distance from Sun' + LineEnding + '(relative to Earth)';
sPERIOD = 'Orbital period' + LineEnding + '(relative to Earth)';
sDIAMETER = 'Diameter (km)';
var
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsBubbleSeries;
fn, dir: String;
begin
dir := ExtractFilePath(ParamStr(0)) + 'files/';
ForceDirectories(dir);
fn := dir + FILE_NAME;
book := TsWorkbook.Create;
try
// worksheet
@ -77,11 +84,11 @@ begin
ser.DataPointStyles.AddSolidFill(2, $c47244);
ser.DataPointStyles.AddSolidFill(3, scRed);
book.WriteToFile(FILE_NAME + '.xlsx', true);
WriteLn('Data saved with chart in ', FILE_NAME + '.xlsx');
book.WriteToFile(fn + '.xlsx', true);
WriteLn('Data saved with chart in ', fn + '.xlsx');
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME + '.ods');
book.WriteToFile(fn + '.ods', true);
WriteLn('Data saved with chart in ', fn + '.ods');
finally
book.Free;
end;

View File

@ -49,7 +49,6 @@
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
<UseHeaptrc Value="True"/>
</Debugging>
</Linking>
</CompilerOptions>

View File

@ -6,16 +6,29 @@ uses
SysUtils, LazVersion,
fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'pie';
var
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
ser: TsPieSeries;
fill: TsChartFill;
line: TsChartLine;
fn, dir: String;
ringMode: Boolean = false;
begin
if (ParamCount >= 1) then
case lowercase(ParamStr(1)) of
'ring': ringMode := true;
end;
case ringMode of
false: fn := 'pie';
true: fn := 'ring';
end;
dir := ExtractFilePath(ParamStr(0)) + 'files/';
ForceDirectories(dir);
fn := dir + fn;
book := TsWorkbook.Create;
try
// worksheet
@ -46,8 +59,7 @@ begin
ch.Legend.Border.Style := clsNoLine;
// Add pie series
ser := TsPieSeries.Create(ch); // Select one of these...
//ser := TsRingSeries.Create(ch);
ser := TsPieSeries.Create(ch);
// Series properties
ser.SetTitleAddr(0, 0);
@ -57,6 +69,8 @@ begin
ser.LabelSeparator := #10; // '\n'; // this is the symbol for a line-break
ser.LabelPosition := lpOutside;
ser.LabelFormat := '#,##0';
if ringMode then
ser.InnerRadiusPercent := 30;
// Individual slice colors, with white border, sector index 1 "exploded"
// Must be complete, otherwise will be ignored by Calc and replaced by default colors
@ -76,11 +90,11 @@ begin
//ser.SetFillColorRange(4, 2, 8, 2);
book.WriteToFile(FILE_NAME+'.xlsx', true);
WriteLn('Data saved with chart in ', FILE_NAME+'.xlsx');
book.WriteToFile(fn+'.xlsx', true);
WriteLn('Data saved with chart in ', fn+'.xlsx');
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME+'.ods');
book.WriteToFile(fn + '.ods', true);
WriteLn('Data saved with chart in ', fn+'.ods');
finally
book.Free;
end;

View File

@ -13,7 +13,7 @@ var
sheet: TsWorksheet;
ch: TsChart;
ser: TsScatterSeries;
fn: String;
dir, fn: String;
rotated: Boolean;
begin
fn := FILE_NAME;
@ -22,6 +22,10 @@ begin
if rotated then
fn := fn + '-rotated';
dir := ExtractFilePath(ParamStr(0)) + 'files/';
ForceDirectories(dir);
fn := dir + fn;
book := TsWorkbook.Create;
try
// Worksheet
@ -70,10 +74,15 @@ begin
ser.Trendline.Equation.XName := 'X';
ser.Trendline.Equation.YName := 'Y';
ser.Trendline.Equation.Border.Style := clsSolid;
ser.Trendline.Equation.Border.Color := scRed;
ser.Trendline.Equation.Border.Color := scGray;
ser.Trendline.Equation.Fill.Style := cfsSolid;
ser.Trendline.Equation.Fill.Color := scSilver;
ser.Trendline.Equation.NumberFormat := '0.000';
// Fine-tuning the position of the trendline result box is not very
// practical and error-prone because its is measure relative to the
// top/left corner of the chart, but we don't know where the plotarea is.
//ser.Trendline.Equation.Top := 5;
//ser.Trendline.Equation.Left := 5;

View File

@ -1,7 +1,9 @@
@echo off
echo Generating chart demo files:
echo -----------------------------
echo GENERATING CHART DEMO FILES
echo -----------------------------
echo.
echo Area series...
echo AREA SERIES
areachart_write_demo
areachart_write_demo stacked
areachart_write_demo percentage
@ -9,55 +11,53 @@ areachart_write_demo rotated
areachart_write_demo stacked rotated
areachart_write_demo percentage rotated
echo.
echo Bar series...
echo BAR SERIES
barchart_write_demo vert
barchart_write_demo horiz
barchart_2axes_write_demo
barchart_2axes_write_demo rotated
barchart_stacked_write_demo
barchart_stacked_write_demo rotated
barchart_stacked_write_demo percentage
barchart_stacked_write_demo percentage rotated
barchart_write_demo vert stacked
barchart_write_demo horiz stacked
barchart_write_demo vert percentage
barchart_write_demo horiz percentage
echo.
echo Bubble series...
echo BUBBLE SERIES
bubblechart_write_demo
echo.
echo Pie series...
echo PIE SERIES
piechart_write_demo
piechart_write_demo ring
echo.
echo Radar series...
echo RADAR SERIES
radarchart_write_demo
echo.
echo Scatter series...
echo SCATTER SERIES
scatter_write_demo lin
scatter_write_demo log
scatter_write_demo log-log
scatter_write_demo lin inverted
scatter_write_demo log inverted
scatter_write_demo log-log inverted
echo.
echo Scatter series with error bars
echo SCATTER SERIES WITH ERROR BARS
errorbars_write_demo
errorbars_write_demo range
echo.
echo Scatter series and regression demo...
echo SCATTER SERIES AND REGRESSION DEMO
regressionchart_write_demo
regressionchart_write_demo rotated
echo.
echo StockSeries...
echo STOCK SERIES
stock_write_demo hlc
stock_write_demo candlestick
echo.
echo StockSeries, rotated axes...
stock_write_demo hlc rotated
stock_write_demo candlestick rotated
echo.
echo StockSeries with volume...
echo STOCK SERIES WITH VOLUME
stock_volume_write_demo hlc area
stock_volume_write_demo hlc bar
stock_volume_write_demo hlc line
stock_volume_write_demo candlestick area
stock_volume_write_demo candlestick bar
stock_volume_write_demo candlestick line
echo.
echo StockSeries with volume, rotated axes...
stock_volume_write_demo hlc area rotated
stock_volume_write_demo hlc bar rotated
stock_volume_write_demo hlc line rotated

View File

@ -8,10 +8,11 @@ uses
procedure WriteHelp;
begin
WriteLn('SYNTAX: scatter_write_demo lin|log|loglog');
WriteLn(' lin ........... Both axes linear');
WriteLn('SYNTAX: scatter_write_demo lin|log|loglog [inverted]');
WriteLn(' lin ........... Both axes linear (default)');
WriteLn(' log ........... y axis logarithmic');
WriteLn(' loglog ........ Both axes logarithmic');
WriteLn(' inverted ...... inverted y axis');
halt;
end;
@ -22,33 +23,37 @@ var
sheet: TsWorksheet;
ch: TsChart;
ser: TsScatterSeries;
fn: String;
mode: Integer; // 0=linear, 1=log, 2=log-log
dir, fn: String;
mode: Integer = 0; // 0=linear, 1=log, 2=log-log
inv: Boolean = false;
i: Integer;
begin
if ParamCount >= 1 then
begin
case lowercase(ParamStr(1)) of
for i := 1 to ParamCount do
case lowercase(ParamStr(i)) of
'lin':
begin
mode := 0;
fn := FILE_NAME + '-lin';
end;
mode := 0;
'log':
begin
mode := 1;
fn := FILE_NAME + '-log';
end;
mode := 1;
'loglog', 'log-log':
begin
mode := 2;
fn := FILE_NAME + '-loglog';
end;
mode := 2;
'inverted', 'inv':
inv := true;
else
WriteHelp;
end;
end else
WriteHelp;
case mode of
0: fn := FILE_NAME + '-lin';
1: fn := FILE_NAME + '-log';
2: fn := FILE_NAME + '-loglog';
end;
if inv then
fn := fn + '-inverted';
dir := ExtractFilePath(ParamStr(0)) + 'files/';
ForceDirectories(dir);
fn := dir + fn;
book := TsWorkbook.Create;
try
@ -92,8 +97,8 @@ begin
end;
end;
// Create chart: left/top in cell D4, 150 mm x 100 mm
ch := book.AddChart(sheet, 2, 3, 150, 100);
// Create chart: left/top in cell D4, 160 mm x 100 mm
ch := book.AddChart(sheet, 2, 2, 160, 100);
// Chart properties
ch.Border.Style := clsNoLine;
@ -111,10 +116,11 @@ begin
ch.YAxis.Logarithmic := true;
end;
end;
ch.YAxis.Inverted := inv;
// For testing:
// ch.XAxis.Inverted := true;
ch.Interpolation := ciCubicSpline;
// For further testing:
// ch.XAxis.Inverted := true;
// ch.Interpolation := ciCubicSpline;
// Add scatter series
ser := TsScatterSeries.Create(ch);

View File

@ -651,11 +651,15 @@ type
TsPieSeries = class(TsChartSeries)
private
FInnerRadiusPercent: Integer;
FSliceOrder: TsSliceOrder;
FStartAngle: Integer; // degrees
function GetSliceOffset(ASliceIndex: Integer): Integer;
protected
function GetChartType: TsChartType; override;
public
constructor Create(AChart: TsChart); override;
property InnerRadiusPercent: Integer read FInnerRadiusPercent write FInnerRadiusPercent;
property StartAngle: Integer read FStartAngle write FStartAngle;
property SliceOffset[ASliceIndex: Integer]: Integer read GetSliceOffset; // Percentage
property SliceOrder: TsSliceOrder read FSliceOrder write FSliceOrder;
@ -665,7 +669,7 @@ type
protected
function GetChartType: TsChartType; override;
end;
{
TsRingSeries = class(TsPieSeries)
private
FInnerRadiusPercent: Integer;
@ -673,7 +677,7 @@ type
constructor Create(AChart: TsChart); override;
property InnerRadiusPercent: Integer read FInnerRadiusPercent write FInnerRadiusPercent;
end;
}
TsCustomScatterSeries = class(TsCustomLineSeries)
public
constructor Create(AChart: TsChart); override;
@ -751,7 +755,7 @@ type
property Items[AIndex: Integer]: TsChartSeries read GetItem write SetItem; default;
end;
TsChartStackMode = (csmSideBySide, csmStacked, csmStackedPercentage);
TsChartStackMode = (csmDefault, csmStacked, csmStackedPercentage);
TsChartInterpolation = (
ciLinear,
ciCubicSpline, ciBSpline,
@ -2517,6 +2521,14 @@ begin
FLine.Color := scBlack;
end;
function TsPieSeries.GetChartType: TsChartType;
begin
if FInnerRadiusPercent > 0 then
Result := ctRing
else
Result := ctPie;
end;
function TsPieSeries.GetSliceOffset(ASliceIndex: Integer): Integer;
var
i: Integer;
@ -2541,7 +2553,7 @@ begin
Result := ctRadar;
end;
(*
{ TsRingSeries }
constructor TsRingSeries.Create(AChart: TsChart);
begin
@ -2549,7 +2561,7 @@ begin
FChartType := ctRing;
FLine.Color := scBlack;
FInnerRadiusPercent := 50;
end;
end; *)
{ TsTrendlineEquation }

View File

@ -216,7 +216,7 @@ const
AXIS_ID: array[TAxisKind] of string = ('x', 'y', 'x', 'y');
AXIS_LEVEL: array[TAxisKind] of string = ('primary', 'primary', 'secondary', 'secondary');
REGRESSION_TYPE: array [TsTrendlineType] of string = (
TRENDLINE_TYPE: array [TsTrendlineType] of string = (
'', 'linear', 'logarithmic', 'exponential', 'power', 'polynomial');
FALSE_TRUE: array[boolean] of string = ('false', 'true');
@ -1321,7 +1321,7 @@ begin
s := GetAttrValue(AStyleNode, 'chart:regression-type');
for rt in TsTrendlineType do
if (s <> '') and (REGRESSION_TYPE[rt] = s) then
if (s <> '') and (TRENDLINE_TYPE[rt] = s) then
begin
trendline.TrendlineType := rt;
break;
@ -1485,17 +1485,31 @@ begin
series := FStockSeries
else
case s of
'chart:area': series := TsAreaSeries.Create(AChart);
'chart:bar': series := TsBarSeries.Create(AChart);
'chart:bubble': series := TsBubbleSeries.Create(AChart);
'chart:circle': series := TsPieSeries.Create(AChart);
'chart:filled-radar': series := TsRadarSeries.Create(AChart);
'chart:line': series := TsLineSeries.Create(AChart);
'chart:radar': series := TsRadarSeries.Create(AChart);
'chart:ring': series := TsRingSeries.Create(AChart);
'chart:scatter': series := TsScatterSeries.Create(AChart);
// 'chart:stock': --- has been created already
else raise Exception.Create('Unknown/unsupported series type.');
'chart:area':
series := TsAreaSeries.Create(AChart);
'chart:bar':
series := TsBarSeries.Create(AChart);
'chart:bubble':
series := TsBubbleSeries.Create(AChart);
// 'chart:circle':
// series := TsPieSeries.Create(AChart);
'chart:filled-radar':
series := TsRadarSeries.Create(AChart);
'chart:line':
series := TsLineSeries.Create(AChart);
'chart:radar':
series := TsRadarSeries.Create(AChart);
'chart:circle':
begin
series := TsPieSeries.Create(AChart);
if FChartType = ctRing then
TsPieSeries(series).InnerRadiusPercent := 50;
end;
'chart:scatter':
series := TsScatterSeries.Create(AChart);
// 'chart:stock': --- has already been created
else
raise Exception.Create('Unknown/unsupported series type.');
end;
ReadChartCellAddr(ANode, 'chart:label-cell-address', series.TitleAddr);
@ -2575,7 +2589,7 @@ begin
verticalStr := 'chart:vertical="true" ';
case AChart.StackMode of
csmSideBySide: ;
csmDefault: ;
csmStacked: stackModeStr := 'chart:stacked="true" ';
csmStackedPercentage: stackModeStr := 'chart:percentage="true" ';
end;
@ -2692,7 +2706,7 @@ begin
'chart:regression-intercept-value="%g" ' +
'chart:regression-max-degree="%d" ',
[ trendline.Title,
REGRESSION_TYPE[trendline.TrendlineType] ,
TRENDLINE_TYPE[trendline.TrendlineType] ,
trendline.ExtrapolateForwardBy,
trendline.ExtrapolateBackwardBy,
FALSE_TRUE[trendline.ForceYIntercept],
@ -2920,7 +2934,7 @@ function TsSpreadOpenDocChartWriter.GetNumberFormatID(ANumFormat: String): Strin
var
idx: Integer;
begin
idx := FNumberFormatList.IndexOf(ANumFormat);
idx := TsChartNumberFormatList(FNumberFormatList).IndexOfFormat(ANumFormat);
if idx > -1 then
Result := Format('N%d', [idx])
else
@ -3748,7 +3762,7 @@ var
domainRangeY: String = '';
fillColorRange: String = '';
lineColorRange: String = '';
chartClass: String = '';
chartType: String = '';
seriesYAxis: String = '';
trendlineEquation: String = '';
trendline: TsChartTrendline = nil;
@ -3756,7 +3770,6 @@ var
i, idx, count: Integer;
nextStyleID, seriesStyleID, trendlineStyleID, trendlineEquStyleID: Integer;
xErrStyleID, yErrStyleID, dataStyleID: Integer;
datapointStyle: TsChartDataPointStyle;
begin
indent := DupeString(' ', AChartIndent);
@ -3850,10 +3863,10 @@ begin
else
count := series.YRange.Col2 - series.YRange.Col1 + 1;
if series is TsRingSeries then
chartClass := 'circle'
if series is TsPieSeries then
chartType := 'circle'
else
chartClass := CHART_TYPE_NAMES[series.ChartType];
chartType := CHART_TYPE_NAMES[series.ChartType];
AppendToStream(AChartStream, Format(
indent + '<chart:series chart:style-name="ch%d" ' +
@ -3861,7 +3874,7 @@ begin
seriesYAxis + // attached y axis
'chart:values-cell-range-address="%s" ' + // y values
'chart:label-cell-address="%s">' + LE, // series title
[ seriesStyleID, chartClass, valuesRange, titleAddr, chartClass ]
[ seriesStyleID, chartType, valuesRange, titleAddr, chartType ]
));
inc(nextStyleID);

View File

@ -1313,37 +1313,38 @@ var
nodeName, s: String;
ser: TsPieSeries;
x: Double;
ringRadius: Integer = 50;
startAngle: Integer = 90;
begin
if ANode = nil then
exit;
while Assigned(ANode) do
begin
nodeName := ANode.NodeName;
s := GetAttrValue(ANode, 'val');
case nodeName of
'c:ser':
begin
if RingMode then
ser := TsRingSeries.Create(AChart)
else
ser := TsPieSeries.Create(AChart);
ser := TsPieSeries.Create(AChart);
ReadChartSeriesProps(ANode.FirstChild, ser);
end;
'c:firstSliceAng':
begin
s := GetAttrValue(ANode, 'val');
if TryStrToFloat(s, x, FPointSeparatorSettings) then
ser.StartAngle := round(x) + 90;
end;
if TryStrToFloat(s, x, FPointSeparatorSettings) then
startAngle := round(x) + 90;
'c:holeSize':
if RingMode then
begin
s := GetAttrValue(ANode, 'val');
if TryStrToFloat(s, x, FPointSeparatorSettings) then
TsRingSeries(ser).InnerRadiusPercent := round(x);
end;
ringRadius := round(x);
end;
ANode := ANode.NextSibling;
end;
if ser <> nil then
begin
TsPieSeries(ser).StartAngle := startAngle;
if RingMode then
TsPieSeries(ser).InnerRadiusPercent := ringRadius;
end;
end;
{@@ ----------------------------------------------------------------------------
@ -3438,7 +3439,7 @@ begin
isfirstOfGroup := false;
if (ASeriesIndex < chart.Series.Count-1) and (chart.Series[ASeriesIndex+1].GroupIndex = ASeries.GroupIndex) then
isLastOfGroup := false;
if chart.StackMode <> csmSideBySide then
if chart.StackMode <> csmDefault then
overlap := 100
end;
@ -3900,7 +3901,7 @@ begin
WriteBubbleSeries(AStream, AIndent + 2, TsBubbleSeries(ser), i);
xAxKind := 'c:valAx';
end;
ctPie:
ctPie, ctRing:
WritePieSeries(AStream, AIndent + 2, TsPieSeries(ser), i);
ctScatter:
begin
@ -3939,23 +3940,35 @@ procedure TsSpreadOOXMLChartWriter.WritePieSeries(AStream: TStream;
var
indent: String;
chart: TsChart;
nodeName: String;
begin
indent := DupeString(' ', AIndent);
chart := ASeries.Chart;
if ASeries.InnerRadiusPercent > 0 then
nodeName := 'c:doughnutChart'
else
nodeName := 'c:pieChart';
AppendToStream(AStream,
indent + '<c:pieChart>' + LE +
indent + '<' + nodeName + '>' + LE +
indent + ' <c:varyColors val="1"/>' + LE
);
WriteChartSeriesNode(AStream, AIndent + 4, ASeries, ASeriesIndex);
if ASeries.InnerRadiusPercent > 0 then
AppendToStream(AStream, Format(
indent + '<c:holeSize val="%d"/>' + LE, [ASeries.InnerRadiusPercent ]
));
AppendToStream(AStream, Format(
indent + '<c:firstSliceAng val="%d"/>' + LE,
[ (90 - ASeries.StartAngle) mod 360 ]
));
AppendToStream(AStream,
indent + '</c:pieChart>' + LE
indent + '</' + nodeName + '>' + LE
);
end;

View File

@ -1354,7 +1354,7 @@ begin
FChart.LeftAxis.Marks.Format := Convert_NumFormatStr_to_FormatStr(axis.LabelFormatPercent)
else
FChart.LeftAxis.Marks.Format := Convert_NumFormatStr_to_FormatStr(axis.LabelFormat);
FChart.Legend.Inverted := ASeries.Chart.StackMode <> csmSideBySide;
FChart.Legend.Inverted := ASeries.Chart.StackMode <> csmDefault;
end;
FChart.AddSeries(ser);
@ -1921,7 +1921,7 @@ begin
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.Line, AChartSeries.AreaContourPen);
AChartSeries.Transparency := round(AWorkbookSeries.Fill.Transparency * 255);
AChartSeries.AreaLinesPen.Style := psClear;
AChartSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmSideBySide;
AChartSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmDefault;
AChartSeries.UseZeroLevel := true;
if AChartSeries.Source is TCalculatedChartSource then
TCalculatedChartSource(AChartSeries.Source).Percentage := (AWorkbookSeries.Chart.StackMode = csmStackedPercentage);
@ -1943,7 +1943,7 @@ procedure TsWorkbookChartLink.UpdateBarSeries(AWorkbookSeries: TsBarSeries;
i, n: Integer;
begin
n := 1;
if (AWorkbookSeries.Chart.GetChartType = ctBar) and (AWorkbookSeries.Chart.StackMode = csmSideBySide) then
if (AWorkbookSeries.Chart.GetChartType = ctBar) and (AWorkbookSeries.Chart.StackMode = csmDefault) then
for i := 0 to AWorkbookSeries.Chart.Series.Count-1 do
begin
ser := AWorkbookSeries.Chart.Series[i];
@ -1961,7 +1961,7 @@ begin
AChartSeries.BarWidthPercent := CalcBarWidthPercent;
AChartSeries.BarOffsetPercent := 0; // TAChart currently does not support offsets in multiple-y bar series.
AChartSeries.BarWidthStyle := bwPercentMin;
AChartSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmSideBySide;
AChartSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmDefault;
if AChartSeries.Source is TCalculatedChartSource then
TCalculatedChartSource(AChartSeries.Source).Percentage := (AWorkbookSeries.Chart.StackMode = csmStackedPercentage);
@ -2628,7 +2628,7 @@ begin
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.Line, lineSeries.LinePen);
lineSeries.ShowLines := AWorkbookSeries.Line.Style <> clsNoLine;
seriesPointer := lineSeries.Pointer;
lineSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmSideBySide;
lineSeries.Stacked := AWorkbookSeries.Chart.StackMode <> csmDefault;
if lineSeries.Source is TCalculatedChartSource then
TCalculatedChartSource(lineSeries.Source).Percentage := (AWorkbookSeries.Chart.StackMode = csmStackedPercentage);
end
@ -2669,8 +2669,8 @@ begin
AChartSeries.Legend.Format := '%2:s';
{$IF LCL_FullVersion >= 2020000}
AChartSeries.StartAngle := AWorkbookSeries.StartAngle;
if AWorkbookSeries is TsRingSeries then
AChartSeries.InnerRadiusPercent := TsRingSeries(AWorkbookSeries).InnerRadiusPercent;
if AWorkbookSeries is TsPieSeries then
AChartSeries.InnerRadiusPercent := TsPieSeries(AWorkbookSeries).InnerRadiusPercent;
{$IFEND}
AChartSeries.Exploded := true;