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:
parent
5f781b622a
commit
775bca202a
@ -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
|
||||
|
@ -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;
|
||||
|
@ -49,7 +49,6 @@
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf3"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 }
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user