You've already forked lazarus-ccr
fpspreadsheet: ods writer supports scatter charts
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8989 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -5,10 +5,12 @@ program write_chart_demo;
|
|||||||
uses
|
uses
|
||||||
SysUtils, fpspreadsheet, fpstypes, fpschart, xlsxooxml, fpsopendocument;
|
SysUtils, fpspreadsheet, fpstypes, fpschart, xlsxooxml, fpsopendocument;
|
||||||
const
|
const
|
||||||
SERIES_CLASS: TsChartSeriesClass = TsAreaSeries;
|
SERIES_CLASS: TsChartSeriesClass = TsScatterSeries;
|
||||||
|
r1 = 1;
|
||||||
|
r2 = 8;
|
||||||
var
|
var
|
||||||
b: TsWorkbook;
|
b: TsWorkbook;
|
||||||
sh1, sh2, sh3: TsWorksheet;
|
sheet1, sheet2, sheet3: TsWorksheet;
|
||||||
ch: TsChart;
|
ch: TsChart;
|
||||||
ser: TsChartSeries;
|
ser: TsChartSeries;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -16,24 +18,28 @@ begin
|
|||||||
b := TsWorkbook.Create;
|
b := TsWorkbook.Create;
|
||||||
try
|
try
|
||||||
// 1st sheet
|
// 1st sheet
|
||||||
sh1 := b.AddWorksheet('test1');
|
sheet1 := b.AddWorksheet('test1');
|
||||||
sh1.WriteText(0, 1, '1+sin(x)');
|
sheet1.WriteText(0, 1, '1+sin(x)');
|
||||||
sh1.WriteText(0, 2, '1+sin(x/2)');
|
sheet1.WriteText(0, 2, '1+sin(x/2)');
|
||||||
for i := 1 to 7 do
|
for i := r1 to r2-1 do
|
||||||
begin
|
begin
|
||||||
sh1.WriteNumber(i, 0, i-1);
|
sheet1.WriteNumber(i, 0, i-1);
|
||||||
sh1.WriteNumber(i, 1, 1+sin(i-1));
|
sheet1.WriteNumber(i, 1, 1+sin(i-1));
|
||||||
sh1.WriteNumber(i, 2, 1+sin((i-1)/2));
|
sheet1.WriteNumber(i, 2, 1+sin((i-1)/2));
|
||||||
end;
|
end;
|
||||||
|
sheet1.WriteNumber(r2, 0, 9);
|
||||||
|
sheet1.WriteNumber(r2, 1, 2);
|
||||||
|
sheet1.WriteNumber(r2, 2, 2.5);
|
||||||
|
|
||||||
// Create chart
|
// Create chart
|
||||||
ch := b.AddChart(sh1, 4, 4, 160, 100);
|
ch := b.AddChart(sheet1, 4, 4, 160, 100);
|
||||||
|
|
||||||
// Add first series (type depending on SERIES_CLASS)
|
// Add first series (type depending on SERIES_CLASS)
|
||||||
ser := SERIES_CLASS.Create(ch);
|
ser := SERIES_CLASS.Create(ch);
|
||||||
ser.SetTitleAddr(0, 1);
|
ser.SetTitleAddr(0, 1);
|
||||||
ser.SetLabelRange(1, 0, 7, 0);
|
ser.SetLabelRange(r1, 0, r2, 0);
|
||||||
ser.SetYRange(1, 1, 7, 1);
|
ser.SetXRange(r1, 0, r2, 0); // is used only by scatter series
|
||||||
|
ser.SetYRange(r1, 1, r2, 1);
|
||||||
ser.Line.Color := scBlue;
|
ser.Line.Color := scBlue;
|
||||||
ser.Fill.FgColor := scBlue;
|
ser.Fill.FgColor := scBlue;
|
||||||
if (ser is TsLineSeries) then
|
if (ser is TsLineSeries) then
|
||||||
@ -44,9 +50,11 @@ begin
|
|||||||
|
|
||||||
// Add second series
|
// Add second series
|
||||||
ser := SERIES_CLASS.Create(ch);
|
ser := SERIES_CLASS.Create(ch);
|
||||||
|
// ser := TsBarSeries.Create(ch);
|
||||||
ser.SetTitleAddr(0, 2);
|
ser.SetTitleAddr(0, 2);
|
||||||
ser.SetLabelRange(1, 0, 7, 0);
|
ser.SetLabelRange(r1, 0, r2, 0);
|
||||||
ser.SetYRange(1, 2, 7, 2);
|
ser.SetXRange(r1, 0, r2, 0);
|
||||||
|
ser.SetYRange(r1, 2, r2, 2);
|
||||||
ser.Line.Color := scRed;
|
ser.Line.Color := scRed;
|
||||||
ser.Fill.FgColor := scRed;
|
ser.Fill.FgColor := scRed;
|
||||||
|
|
||||||
@ -114,20 +122,21 @@ begin
|
|||||||
ch.Legend.Position := lpBottom;
|
ch.Legend.Position := lpBottom;
|
||||||
|
|
||||||
// 2nd sheet
|
// 2nd sheet
|
||||||
sh2 := b.AddWorksheet('test2');
|
sheet2 := b.AddWorksheet('test2');
|
||||||
|
sheet2.WriteText(0, 0, 'abc');
|
||||||
|
|
||||||
// 3rd sheet
|
// 3rd sheet
|
||||||
sh3 := b.AddWorksheet('test3');
|
sheet3 := b.AddWorksheet('test3');
|
||||||
sh3.WriteText(0, 1, 'cos(x)');
|
sheet3.WriteText(0, 1, 'cos(x)');
|
||||||
sh3.WriteText(0, 2, 'sin(x)');
|
sheet3.WriteText(0, 2, 'sin(x)');
|
||||||
for i := 1 to 7 do
|
for i := 1 to 7 do
|
||||||
begin
|
begin
|
||||||
sh3.WriteNumber(i, 0, i-1);
|
sheet3.WriteNumber(i, 0, i-1);
|
||||||
sh3.WriteNumber(i, 1, cos(i-1), nfFixed, 2);
|
sheet3.WriteNumber(i, 1, cos(i-1), nfFixed, 2);
|
||||||
sh3.WriteNumber(i, 2, sin(i-1), nfFixed, 2);
|
sheet3.WriteNumber(i, 2, sin(i-1), nfFixed, 2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ch := b.AddChart(sh3, 1, 3, 125, 95);
|
ch := b.AddChart(sheet3, 1, 3, 125, 95);
|
||||||
ser := TsLineSeries.Create(ch);
|
ser := TsLineSeries.Create(ch);
|
||||||
ser.SetTitleAddr(0, 1);
|
ser.SetTitleAddr(0, 1);
|
||||||
ser.SetLabelRange(1, 0, 7, 0);
|
ser.SetLabelRange(1, 0, 7, 0);
|
||||||
|
@ -265,6 +265,11 @@ type
|
|||||||
property ShowSymbols: Boolean read FShowSymbols write FShowSymbols;
|
property ShowSymbols: Boolean read FShowSymbols write FShowSymbols;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
TsScatterSeries = class(TsLineSeries)
|
||||||
|
public
|
||||||
|
constructor Create(AChart: TsChart); override;
|
||||||
|
end;
|
||||||
|
|
||||||
TsChartSeriesList = class(TFPList)
|
TsChartSeriesList = class(TFPList)
|
||||||
private
|
private
|
||||||
function GetItem(AIndex: Integer): TsChartSeries;
|
function GetItem(AIndex: Integer): TsChartSeries;
|
||||||
@ -745,6 +750,15 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ TsScatterSeries }
|
||||||
|
|
||||||
|
constructor TsScatterSeries.Create(AChart: TsChart);
|
||||||
|
begin
|
||||||
|
inherited Create(AChart);
|
||||||
|
FChartType := ctScatter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ TsChart }
|
{ TsChart }
|
||||||
|
|
||||||
constructor TsChart.Create;
|
constructor TsChart.Create;
|
||||||
|
@ -7073,7 +7073,7 @@ begin
|
|||||||
indent := DupeString(' ', AChartIndent);
|
indent := DupeString(' ', AChartIndent);
|
||||||
|
|
||||||
// Plot area properties
|
// Plot area properties
|
||||||
// ods has a table:cell-range-address here but it is reconstructed by Calc
|
// (ods has a table:cell-range-address here but it is reconstructed by Calc)
|
||||||
AppendToStream(AChartStream, Format(
|
AppendToStream(AChartStream, Format(
|
||||||
indent + '<chart:plot-area chart:style-name="ch%d" chart:data-source-has-labels="both">' + LE,
|
indent + '<chart:plot-area chart:style-name="ch%d" chart:data-source-has-labels="both">' + LE,
|
||||||
[ AStyleID ]
|
[ AStyleID ]
|
||||||
@ -7142,6 +7142,7 @@ var
|
|||||||
sheet: TsWorksheet;
|
sheet: TsWorksheet;
|
||||||
series: TsChartSeries;
|
series: TsChartSeries;
|
||||||
valuesRange: String;
|
valuesRange: String;
|
||||||
|
domainRange: String = '';
|
||||||
titleAddr: String;
|
titleAddr: String;
|
||||||
count: Integer;
|
count: Integer;
|
||||||
begin
|
begin
|
||||||
@ -7150,6 +7151,16 @@ begin
|
|||||||
series := AChart.Series[ASeriesIndex];
|
series := AChart.Series[ASeriesIndex];
|
||||||
sheet := TsWorkbook(FWorkbook).GetWorksheetByIndex(AChart.sheetIndex);
|
sheet := TsWorkbook(FWorkbook).GetWorksheetByIndex(AChart.sheetIndex);
|
||||||
|
|
||||||
|
if series is TsScatterSeries then
|
||||||
|
begin
|
||||||
|
domainRange := GetSheetCellRangeString_ODS(
|
||||||
|
sheet.Name, sheet.Name,
|
||||||
|
series.XRange.Row1, series.XRange.Col1,
|
||||||
|
series.XRange.Row2, series.XRange.Col2,
|
||||||
|
rfAllRel, false
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
valuesRange := GetSheetCellRangeString_ODS(
|
valuesRange := GetSheetCellRangeString_ODS(
|
||||||
sheet.Name, sheet.Name,
|
sheet.Name, sheet.Name,
|
||||||
series.YRange.Row1, series.YRange.Col1,
|
series.YRange.Row1, series.YRange.Col1,
|
||||||
@ -7171,6 +7182,11 @@ begin
|
|||||||
'chart:class="chart:%s">' + LE,
|
'chart:class="chart:%s">' + LE,
|
||||||
[ AStyleID, valuesRange, titleAddr, CHART_TYPE_NAMES[series.ChartType] ]
|
[ AStyleID, valuesRange, titleAddr, CHART_TYPE_NAMES[series.ChartType] ]
|
||||||
));
|
));
|
||||||
|
if domainRange <> '' then
|
||||||
|
AppendToStream(AChartStream, Format(
|
||||||
|
indent + '<chart:domain table:cell-range-address="%s"/>' + LE,
|
||||||
|
[ domainRange ]
|
||||||
|
));
|
||||||
AppendToStream(AChartStream, Format(
|
AppendToStream(AChartStream, Format(
|
||||||
indent + ' <chart:data-point chart:repeated="%d"/>' + LE,
|
indent + ' <chart:data-point chart:repeated="%d"/>' + LE,
|
||||||
[ count ]
|
[ count ]
|
||||||
|
Reference in New Issue
Block a user