fpspreadsheet: ods reader support chart axes.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9019 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2023-11-09 23:15:33 +00:00
parent 78fe3945ba
commit d4f01977aa
8 changed files with 399 additions and 97 deletions

View File

@ -5,16 +5,19 @@ program barchart_write_demo;
uses
SysUtils,
fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'bars';
var
b: TsWorkbook;
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
// worksheet
sheet := b.AddWorksheet('bar_series');
sheet := book.AddWorksheet('bar_series');
// Enter data
sheet.WriteText( 0, 0, 'School Grades');
@ -30,15 +33,15 @@ begin
sheet.WriteText(10, 0, 'Computer'); sheet.WriteNumber(10, 1, 16); sheet.WriteNumber(10, 2, 18);
// Create chart: left/top in cell D4, 160 mm x 100 mm
ch := b.AddChart(sheet, 2, 3, 120, 100);
ch := book.AddChart(sheet, 2, 3, 120, 100);
// Chart properties
ch.Border.Style := clsNoLine;
ch.Title.Caption := 'School Grades';
ch.Title.Font.Style := [fssBold];
ch.Legend.Border.Style := clsNoLine;
ch.XAxis.Caption := '';
ch.YAxis.Caption := '';
ch.XAxis.Title.Caption := '';
ch.YAxis.Title.Caption := 'Grade points';
ch.YAxis.AxisLine.Color := scSilver;
ch.YAxis.MajorTicks := [];
@ -62,10 +65,15 @@ begin
ser.Fill.Hatch := ch.Hatches.AddHatch('Forward', chsSingle, scWhite, 1.5, 45, true);
ser.Fill.Color := scBlue;
// b.WriteToFile('bars.xlsx', true); // Excel fails to open the file
b.WriteToFile('bars.ods', true);
{
book.WriteToFile(FILE_NAME + '.xlsx', true); // Excel fails to open the file
WriteLn('Data saved with chart in ', FILENAME, '.xlsx');
}
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME, '.ods');
finally
b.Free;
book.Free;
end;
end.

View File

@ -5,16 +5,19 @@ program piechart_write_demo;
uses
SysUtils,
fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'world-population';
var
b: TsWorkbook;
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
// worksheet
sheet := b.AddWorksheet('pie_series');
sheet := book.AddWorksheet('pie_series');
// Enter data
sheet.WriteText(0, 0, 'World population');
@ -29,7 +32,7 @@ begin
sheet.WriteText(8, 0, 'Oceania'); sheet.WriteNumber(8, 1, 42); // sheet.WriteChartColor(8, 2, $FF8080);
// Create chart: left/top in cell D4, 120 mm x 100 mm
ch := b.AddChart(sheet, 2, 3, 120, 100);
ch := book.AddChart(sheet, 2, 3, 120, 100);
// Chart properties
ch.Border.Style := clsNoLine;
@ -52,10 +55,15 @@ begin
ser.LabelFormat := '#,##0';
//ser.SetFillColorRange(4, 2, 8, 2);
b.WriteToFile('world-population.xlsx', true); // Excel fails to open the file
b.WriteToFile('world-population.ods', true);
{
book.WriteToFile(FILE_NAME+'.xlsx', true); // Excel fails to open the file
WriteLn('Data saved with chart in ', FILE_NAME, '.xlsx');
}
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME, '.ods');
finally
b.Free;
book.Free;
end;
end.

View File

@ -5,16 +5,19 @@ program radarchart_write_demo;
uses
SysUtils,
fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'school-grades';
var
b: TsWorkbook;
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
// worksheet
sheet := b.AddWorksheet('radar_series');
sheet := book.AddWorksheet('radar_series');
// Enter data
sheet.WriteText( 0, 0, 'School Grades');
@ -30,15 +33,15 @@ begin
sheet.WriteText(10, 0, 'Computer'); sheet.WriteNumber(10, 1, 16); sheet.WriteNumber(10, 2, 18);
// Create chart: left/top in cell D4, 160 mm x 100 mm
ch := b.AddChart(sheet, 2, 3, 120, 100);
ch := book.AddChart(sheet, 2, 3, 120, 100);
// Chart properties
ch.Border.Style := clsNoLine;
ch.Title.Caption := 'School Grades';
ch.Title.Font.Style := [fssBold];
ch.Legend.Border.Style := clsNoLine;
ch.XAxis.Caption := '';
ch.YAxis.Caption := '';
ch.XAxis.Title.Caption := '';
ch.YAxis.Title.Caption := '';
ch.YAxis.AxisLine.Color := scSilver;
ch.YAxis.MajorTicks := [];
@ -60,10 +63,15 @@ begin
ser.Fill.Color := scBlue;
ser.Fill.Transparency := 0.35;
b.WriteToFile('school-grades.xlsx', true); // Excel fails to open the file
b.WriteToFile('school-grades.ods', true);
{
book.WriteToFile(FILE_NAME + '.xlsx', true); // Excel fails to open the file
WriteLn('Data saved with chart in ', FILE_NAME, '.xlsx');
}
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME, '.ods');
finally
b.Free;
book.Free;
end;
end.

View File

@ -5,21 +5,23 @@ uses
fpSpreadsheet, fpsTypes, fpsChart, fpsOpenDocument;
const
// FILE_NAME = 'test.ods';
FILE_NAME = 'area.ods';
FILE_NAME = 'test.ods';
// FILE_NAME = 'area.ods';
var
b: TsWorkbook;
book: TsWorkbook;
sheet: TsWorksheet;
chart: TsChart;
i, j: Integer;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
b.ReadFromFile(FILE_NAME);
for i := 0 to b.GetChartCount-1 do
book.ReadFromFile(FILE_NAME);
for i := 0 to book.GetChartCount-1 do
begin
chart := b.GetChartByIndex(i);
sheet := b.GetWorksheetByIndex(chart.SheetIndex);
chart := book.GetChartByIndex(i);
sheet := book.GetWorksheetByIndex(chart.SheetIndex);
WriteLn('--------------------------------------------------------------------------------');
WriteLn('Chart "', chart.Name, '":');
WriteLn(' Worksheet "', sheet.Name, '", ',
'row:', chart.Row, ' (+',chart.OffsetY:0:0, 'mm) ',
@ -117,10 +119,70 @@ begin
WriteLn(' Font: "', chart.Subtitle.Font.FontName, '" Size:', chart.Subtitle.Font.Size:0:0,
' Style:', SetToString(PTypeInfo(TypeInfo(TsFontStyles)), integer(chart.Subtitle.Font.Style), True),
' Color:', IntToHex(chart.Subtitle.Font.Color, 6));
WriteLn;
WriteLn(' CHART X AXIS');
WriteLn(' VISIBLE:', chart.YAxis.Visible);
WriteLn(' TITLE: Caption: "', StringReplace(chart.XAxis.Title.Caption, FPS_LINE_ENDING, '\n', [rfReplaceAll]), '"',
' Visible: ', chart.XAxis.Title.Visible,
' Rotation: ', chart.XAxis.Title.RotationAngle,
' Font: "', chart.XAxis.Title.Font.FontName, '" Size:', chart.XAxis.Title.Font.Size:0:0,
' Style:', SetToString(PTypeInfo(TypeInfo(TsFontStyles)), integer(chart.XAxis.Title.Font.Style), True),
' Color:', IntToHex(chart.XAxis.Title.Font.Color, 6));
WriteLn(' RANGE: AutomaticMin:', chart.XAxis.AutomaticMin, ' Minimum: ', chart.XAxis.Min:0:3,
' AutomaticMax:', chart.XAxis.AutomaticMax, ' Maximum: ', chart.XAxis.Max:0:3);
WriteLn(' POSITION: ', GetEnumName(TypeInfo(TsChartAxisPosition), ord(chart.XAXis.Position)),
' Value:', chart.XAxis.PositionValue:0:3);
WriteLn(' AXIS TICKS: Major interval:', chart.XAxis.MajorInterval:0:2,
' Major ticks:', SetToString(PTypeInfo(TypeInfo(TsChartAxisTicks)), integer(chart.XAxis.MajorTicks), True),
' Minor count:', chart.XAxis.MinorCount,
' Minor ticks:', SetToString(PTypeInfo(TypeInfo(TsChartAxisTicks)), integer(chart.XAxis.MinorTicks), True));
WriteLn(' AXIS LINE: Style:', chart.XAxis.AxisLine.Style,
' Width:', chart.XAxis.AxisLine.Width:0:0, 'mm',
' Color:', IntToHex(chart.XAxis.AxisLine.Color, 6),
' Transparency:', chart.XAxis.AxisLine.Transparency:0:2);
WriteLn(' MAJOR GRID: Style:', chart.XAxis.MajorGridLines.Style,
' Width:', chart.XAxis.MajorGridLines.Width:0:0, 'mm',
' Color:', IntToHex(chart.XAxis.MajorGridLines.Color, 6),
' Transparency:', chart.XAxis.MajorGridLines.Transparency:0:2);
WriteLn(' MINOR GRID: Style:', chart.XAxis.MinorGridLines.Style,
' Width:', chart.XAxis.MinorGridLines.Width:0:0, 'mm',
' Color:', IntToHex(chart.XAxis.MinorGridLines.Color, 6),
' Transparency:', chart.XAxis.MinorGridLines.Transparency:0:2);
WriteLn;
WriteLn(' CHART Y AXIS:');
WriteLn(' VISIBLE:', chart.YAxis.Visible);
WriteLn(' TITLE: Caption: "', StringReplace(chart.YAxis.Title.Caption, FPS_LINE_ENDING, '\n', [rfReplaceAll]), '"',
' Visible: ', chart.YAxis.Title.Visible,
' Rotation: ', chart.YAxis.Title.RotationAngle,
' Font: "', chart.YAxis.Title.Font.FontName, '" Size:', chart.YAxis.Title.Font.Size:0:0,
' Style:', SetToString(PTypeInfo(TypeInfo(TsFontStyles)), integer(chart.YAxis.Title.Font.Style), True),
' Color:', IntToHex(chart.YAxis.Title.Font.Color, 6));
WriteLn(' RANGE: AutomaticMin:', chart.YAxis.AutomaticMin, ' Minimum: ', chart.YAxis.Min:0:3,
' AutomaticMax:', chart.YAxis.AutomaticMax, ' Maximum: ', chart.YAxis.Max:0:3);
WriteLn(' POSITION: ', GetEnumName(TypeInfo(TsChartAxisPosition), ord(chart.YAXis.Position)),
' Value:', chart.YAxis.PositionValue:0:3);
WriteLn(' AXIS TICKS: Major interval:', chart.YAxis.MajorInterval:0:2,
' Major ticks:', SetToString(PTypeInfo(TypeInfo(TsChartAxisTicks)), integer(chart.YAxis.MajorTicks), True),
' Minor count:', chart.YAxis.MinorCount,
' Minor ticks:', SetToString(PTypeInfo(TypeInfo(TsChartAxisTicks)), integer(chart.YAxis.MinorTicks), True));
WriteLn(' AXIS LINE: Style:', chart.YAxis.AxisLine.Style,
' Width:', chart.YAxis.AxisLine.Width:0:0, 'mm',
' Color:', IntToHex(chart.YAxis.AxisLine.Color, 6),
' Transparency:', chart.YAxis.AxisLine.Transparency:0:2);
WriteLn(' MAJOR GRID: Style:', chart.YAxis.MajorGridLines.Style,
' Width:', chart.YAxis.MajorGridLines.Width:0:0, 'mm',
' Color:', IntToHex(chart.YAxis.MajorGridLines.Color, 6),
' Transparency:', chart.YAxis.MajorGridLines.Transparency:0:2);
WriteLn(' MINOR GRID: Style:', chart.YAxis.MinorGridLines.Style,
' Width:', chart.YAxis.MinorGridLines.Width:0:0, 'mm',
' Color:', IntToHex(chart.YAxis.MinorGridLines.Color, 6),
' Transparency:', chart.YAxis.MinorGridLines.Transparency:0:2);
end;
finally
b.Free;
book.Free;
end;
WriteLn;

View File

@ -5,16 +5,19 @@ program regressionchart_write_demo;
uses
SysUtils,
fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'regression';
var
b: TsWorkbook;
book: TsWorkbook;
sheet: TsWorksheet;
ch: TsChart;
ser: TsScatterSeries;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
// worksheet
sheet := b.AddWorksheet('regression_test');
sheet := book.AddWorksheet('regression_test');
// Enter data
sheet.WriteText(0, 0, 'Data');
@ -28,7 +31,7 @@ begin
sheet.WriteNumber(8, 0, 6.8); sheet.WriteNumber(8, 1, 7.1); // sheet.WriteChartColor(8, 2, $FF8080);
// Create chart: left/top in cell D4, 120 mm x 100 mm
ch := b.AddChart(sheet, 2, 3, 120, 100);
ch := book.AddChart(sheet, 2, 3, 120, 100);
// Chart properties
ch.Border.Style := clsNoLine;
@ -65,10 +68,15 @@ begin
//ser.Regression.Equation.Top := 5;
//ser.Regression.Equation.Left := 5;
b.WriteToFile('regression.xlsx', true); // Excel fails to open the file
b.WriteToFile('regression.ods', true);
{
book.WriteToFile(FILE_NAME + '.xlsx', true); // Excel fails to open the file
WriteLn('Data saved with chart to ', FILE_NAME, '.xlsx');
}
book.WriteToFile('regression.ods', true);
WriteLn('Data saved with chart to ', FILE_NAME, '.ods');
finally
b.Free;
book.Free;
end;
end.

View File

@ -4,7 +4,9 @@ program write_chart_demo;
uses
SysUtils, fpspreadsheet, fpstypes, fpsUtils, fpschart, xlsxooxml, fpsopendocument;
const
FILE_NAME = 'test';
// SERIES_CLASS: TsChartSeriesClass = TsAreaSeries;
// SERIES_CLASS: TsChartSeriesClass = TsBarSeries;
// SERIES_CLASS: TsChartSeriesClass = TsBubbleSeries;
@ -16,18 +18,18 @@ const
r2 = 8;
FILL_COLORS: array[0..r2-r1] of TsColor = (scRed, scGreen, scBlue, scYellow, scMagenta, scSilver, scBlack, scOlive);
var
b: TsWorkbook;
book: TsWorkbook;
sheet1, sheet2, sheet3: TsWorksheet;
ch: TsChart;
ser: TsChartSeries;
i: Integer;
begin
b := TsWorkbook.Create;
book := TsWorkbook.Create;
try
// -------------------------------------------------------------------------
// 1st sheet
// -------------------------------------------------------------------------
sheet1 := b.AddWorksheet('test1');
sheet1 := book.AddWorksheet('test1');
sheet1.WriteText(0, 1, '1+sin(x)');
sheet1.WriteText(0, 2, '1+sin(x/2)');
sheet1.WriteText(0, 3, 'Bubble Radius');
@ -54,7 +56,7 @@ begin
sheet1.WriteNumber(r2, 3, r2*r2);
// Create chart
ch := b.AddChart(sheet1, 4, 6, 160, 100);
ch := book.AddChart(sheet1, 4, 6, 160, 100);
// Add first series (type depending on SERIES_CLASS)
ser := SERIES_CLASS.Create(ch);
@ -113,9 +115,9 @@ begin
ch.XAxis.LabelFont.Color := scRed;
//ch.XAxis.LabelFont.Style := [fssStrikeout];
ch.XAxis.AxisLine.Color := scRed;
ch.XAxis.Caption := 'This is the x axis';
ch.XAxis.CaptionFont.Color := scRed;
ch.XAxis.CaptionFont.Size := 12;
ch.XAxis.Title.Caption := 'This is the x axis';
ch.XAxis.Title.Font.Color := scRed;
ch.XAxis.Title.Font.Size := 12;
//ch.XAxis.Inverted := true;
ch.XAxis.MajorGridLines.Color := scRed;
ch.XAxis.MinorGridLines.Color := scBlue;
@ -127,9 +129,9 @@ begin
ch.YAxis.LabelFont.Size := 8;
ch.YAxis.LabelFont.Color := scBlue;
ch.YAxis.AxisLine.Color := scBlue;
ch.YAxis.Caption := 'This is the y axis';
ch.YAxis.CaptionFont.Color := scBlue;
ch.YAxis.CaptionFont.Size := 12;
ch.YAxis.Title.Caption := 'This is the y axis';
ch.YAxis.Title.Font.Color := scBlue;
ch.YAxis.Title.Font.Size := 12;
//ch.YAxis.LabelRotation := 90;
//ch.YAxis.CaptionRotation := 90;
ch.YAxis.Min := -5;
@ -163,13 +165,13 @@ begin
// -------------------------------------------------------------------------
// 2nd sheet
// -------------------------------------------------------------------------
sheet2 := b.AddWorksheet('test2');
sheet2 := book.AddWorksheet('test2');
sheet2.WriteText(0, 0, 'abc');
// -------------------------------------------------------------------------
// 3rd sheet
// -------------------------------------------------------------------------
sheet3 := b.AddWorksheet('test3');
sheet3 := book.AddWorksheet('test3');
sheet3.WriteText(0, 1, 'cos(x)');
sheet3.WriteText(0, 2, 'sin(x)');
for i := 1 to 7 do
@ -180,7 +182,7 @@ begin
end;
// Create the chart
ch := b.AddChart(sheet3, 1, 3, 125, 95);
ch := book.AddChart(sheet3, 1, 3, 125, 95);
// Add two series
ser := TsLineSeries.Create(ch);
@ -210,18 +212,23 @@ begin
ch.XAxis.MinorGridLines.Style := clsNoLine;
ch.YAxis.MajorGridLines.Style := clsNoLine;
ch.YAxis.MinorGridLines.Style := clsNoLine;
ch.YAxis.CaptionRotation := 90;
ch.XAxis.CaptionFont.Size := 14;
ch.YAxis.CaptionFont.Size := 14;
ch.YAxis.Title.RotationAngle := 90;
ch.XAxis.Title.Font.Size := 14;
ch.YAxis.Title.Font.Size := 14;
ch.XAxis.LabelFont.Style := [fssItalic];
ch.YAxis.LabelFont.Style := [fssItalic];
ch.YAxis.MajorTicks := [catInside, catOutside];
ch.YAxis.MinorTicks := [catOutside];
b.WriteToFile('test.xlsx', true); // Excel fails to open the file
b.WriteToFile('test.ods', true);
{
book.WriteToFile(FILE_NAME + '.xlsx', true); // Excel fails to open the file
WriteLn('Data saved with chart in ', FILE_NAME, '.xlsx');
}
book.WriteToFile(FILE_NAME + '.ods', true);
WriteLn('Data saved with chart in ', FILE_NAME, '.ods');
finally
b.Free;
book.Free;
end;
WriteLn;

View File

@ -169,7 +169,6 @@ type
private
FCaption: String;
FRotationAngle: Integer;
FShowCaption: Boolean;
FFont: TsFont;
FPosX, FPosY: Double;
public
@ -177,10 +176,10 @@ type
destructor Destroy; override;
property Caption: String read FCaption write FCaption;
property Font: TsFont read FFont write FFont;
property ShowCaption: Boolean read FShowCaption write FShowCaption;
property RotationAngle: Integer read FRotationAngle write FRotationAngle;
property PosX: Double read FPosX write FPosX;
property PosY: Double read FPosY write FPosY;
property Visible;
end;
TsChartAxisPosition = (capStart, capEnd, capValue);
@ -196,12 +195,10 @@ type
FAutomaticMajorInterval: Boolean;
FAutomaticMinorSteps: Boolean;
FAxisLine: TsChartLine;
FCategoryRange: TsCellRange;
FMajorGridLines: TsChartLine;
FMinorGridLines: TsChartline;
FInverted: Boolean;
FCaption: String;
FCaptionFont: TsFont;
FCaptionRotation: Integer;
FLabelFont: TsFont;
FLabelFormat: String;
FLabelFormatPercent: String;
@ -211,11 +208,11 @@ type
FMajorTicks: TsChartAxisTicks;
FMax: Double;
FMin: Double;
FMinorSteps: Double;
FMinorCount: Integer;
FMinorTicks: TsChartAxisTicks;
FPosition: TsChartAxisPosition;
FTitle: TsChartText;
FPositionValue: Double;
FShowCaption: Boolean;
FShowLabels: Boolean;
public
constructor Create(AChart: TsChart);
@ -225,9 +222,7 @@ type
property AutomaticMajorInterval: Boolean read FAutomaticMajorInterval write FAutomaticMajorInterval;
property AutomaticMinorSteps: Boolean read FAutomaticMinorSteps write FAutomaticMinorSteps;
property AxisLine: TsChartLine read FAxisLine write FAxisLine;
property Caption: String read FCaption write FCaption;
property CaptionFont: TsFont read FCaptionFont write FCaptionFont;
property CaptionRotation: Integer read FCaptionRotation write FCaptionRotation;
property CategoryRange: TsCellRange read FCategoryRange write FCategoryRange;
property Inverted: Boolean read FInverted write FInverted;
property LabelFont: TsFont read FLabelFont write FLabelFont;
property LabelFormat: String read FLabelFormat write FLabelFormat;
@ -240,12 +235,13 @@ type
property Max: Double read FMax write FMax;
property Min: Double read FMin write FMin;
property MinorGridLines: TsChartLine read FMinorGridLines write FMinorGridLines;
property MinorSteps: Double read FMinorSteps write FMinorSteps;
property MinorCount: Integer read FMinorCount write FMinorCount;
property MinorTicks: TsChartAxisTicks read FMinorTicks write FMinorTicks;
property Position: TsChartAxisPosition read FPosition write FPosition;
property PositionValue: Double read FPositionValue write FPositionValue;
property ShowCaption: Boolean read FShowCaption write FShowCaption;
property ShowLabels: Boolean read FShowLabels write FShowLabels;
property Title: TsChartText read FTitle write FTitle;
property Visible;
end;
TsChartLegendPosition = (lpRight, lpTop, lpBottom, lpLeft);
@ -839,11 +835,11 @@ end;
constructor TsChartText.Create(AChart: TsChart);
begin
inherited Create(AChart);
FShowCaption := true;
FFont := TsFont.Create;
FFont.Size := 10;
FFont.Style := [];
FFont.Color := scBlack;
FVisible := true;
end;
destructor TsChartText.Destroy;
@ -864,10 +860,7 @@ begin
FAutomaticMajorInterval := true;
FAutomaticMinorSteps := true;
FCaptionFont := TsFont.Create;
FCaptionFont.Size := 10;
FCaptionFont.Style := [];
FCaptionFont.Color := scBlack;
FTitle := TsChartText.Create(AChart);
FLabelFont := TsFont.Create;
FLabelFont.Size := 9;
@ -875,11 +868,7 @@ begin
FLabelFont.Color := scBlack;
FLabelFormatPercent := '0%';
FCaptionRotation := 0;
FLabelRotation := 0;
FShowCaption := true;
FShowLabels := true;
FAxisLine := TsChartLine.Create;
@ -907,7 +896,7 @@ begin
FMajorGridLines.Free;
FAxisLine.Free;
FLabelFont.Free;
FCaptionFont.Free;
FTitle.Free;
inherited;
end;
@ -1318,29 +1307,29 @@ begin
FLegend := TsChartLegend.Create(self);
FXAxis := TsChartAxis.Create(self);
FXAxis.Caption := 'x axis';
FXAxis.CaptionFont.Style := [fssBold];
FXAxis.Title.Caption := 'x axis';
FXAxis.Title.Font.Style := [fssBold];
FXAxis.LabelFont.Size := 9;
FXAxis.Position := capStart;
FX2Axis := TsChartAxis.Create(self);
FX2Axis.Caption := 'Secondary x axis';
FX2Axis.CaptionFont.Style := [fssBold];
FX2Axis.Title.Caption := 'Secondary x axis';
FX2Axis.Title.Font.Style := [fssBold];
FX2Axis.LabelFont.Size := 9;
FX2Axis.Visible := false;
FX2Axis.Position := capEnd;
FYAxis := TsChartAxis.Create(self);
FYAxis.Caption := 'y axis';
FYAxis.CaptionFont.Style := [fssBold];
FYAxis.CaptionRotation := 90;
FYAxis.Title.Caption := 'y axis';
FYAxis.Title.Font.Style := [fssBold];
FYAxis.Title.RotationAngle := 90;
FYAxis.LabelFont.Size := 9;
FYAxis.Position := capStart;
FY2Axis := TsChartAxis.Create(self);
FY2Axis.Caption := 'Secondary y axis';
FY2Axis.CaptionFont.Style := [fssBold];
FY2Axis.CaptionRotation := 90;
FY2Axis.Title.Caption := 'Secondary y axis';
FY2Axis.Title.Font.Style := [fssBold];
FY2Axis.Title.RotationAngle := 90;
FY2Axis.LabelFont.Size := 9;
FY2Axis.Visible := false;
FY2Axis.Position := capEnd;

View File

@ -23,9 +23,14 @@ type
procedure GetChartFillProps(ANode: TDOMNode; AChart: TsChart; AFill: TsChartFill);
procedure GetChartLineProps(ANode: TDOMNode; AChart: TsChart; ALine: TsChartLine);
procedure ReadChartAxisGrid(ANode, AStyleNode: TDOMNode; AChart: TsChart; Axis: TsChartAxis);
procedure ReadChartAxisProps(ANode, AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartAxisStyle(AStyleNode: TDOMNode; AChart: TsChart; Axis: TsChartAxis);
procedure ReadChartBackgroundStyle(AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartCellRange(ANode: TDOMNode; AChart: TsChart; var ARange: TsCellRange);
procedure ReadChartProps(AChartNode, AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartPlotAreaProps(ANode, AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartPlotAreaStyle(AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartLegendProps(ANode, AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartLegendStyle(AStyleNode: TDOMNode; AChart: TsChart);
procedure ReadChartTitleProps(ANode, AStyleNode: TDOMNode; AChart: TsChart; ATitle: TsChartText);
@ -451,6 +456,158 @@ begin
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartAxisGrid(ANode, AStyleNode: TDOMNode;
AChart: TsChart; Axis: TsChartAxis);
var
s: String;
styleNode: TDOMNode;
grid: TsChartLine;
begin
s := GetAttrValue(ANode, 'chart:class');
case s of
'major': grid := Axis.MajorGridLines;
'minor': grid := Axis.MinorGridLines;
else exit;
end;
s := GetAttrValue(ANode, 'chart:style-name');
styleNode := FindStyleNode(AStyleNode, s);
GetChartLineProps(styleNode, AChart, grid);
end;
procedure TsSpreadOpenDocChartReader.ReadChartAxisProps(ANode, AStyleNode: TDOMNode;
AChart: TsChart);
var
s, styleName, nodeName: String;
styleNode, subNode: TDOMNode;
axis: TsChartAxis;
rng: TsCellRange;
begin
s := GetAttrValue(ANode, 'chart:name');
case s of
'primary-x': axis := AChart.XAxis;
'primary-y': axis := AChart.YAxis;
'secondary-x': axis := AChart.X2Axis;
'secondary-y': axis := AChart.Y2Axis;
else raise Exception.Create('Unknown chart axis.');
end;
s := GetAttrValue(ANode, 'chart:style-name');
styleNode := FindStyleNode(AStyleNode, s);
ReadChartAxisStyle(styleNode, AChart, axis);
subNode := ANode.FirstChild;
while subNode <> nil do
begin
nodeName := subNode.NodeName;
case nodeName of
'chart:title':
ReadChartTitleProps(subNode, AStyleNode, AChart, axis.Title);
'chart:categories':
begin
rng := axis.CategoryRange;
ReadChartCellRange(subNode, AChart, rng);
axis.CategoryRange := rng;
end;
'chart:grid':
ReadChartAxisGrid(subNode, AStyleNode, AChart, axis);
end;
subNode := subNode.NextSibling;
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartAxisStyle(AStyleNode: TDOMNode;
AChart: TsChart; Axis: TsChartAxis);
var
nodeName: String;
s: String;
value: Double;
n: Integer;
ticks: TsChartAxisTicks = [];
begin
AStyleNode := AStyleNode.FirstChild;
while AStyleNode <> nil do
begin
nodeName := AStyleNode.NodeName;
case nodeName of
'style:text-properties':
TsSpreadOpenDocReader(Reader).ReadFont(AStyleNode, Axis.LabelFont);
'style:graphic-properties':
GetChartLineProps(AStyleNode, AChart, Axis.AxisLine);
'style:chart-properties':
begin
s := GetAttrValue(AStyleNode, 'chart:display-label');
if s = 'true' then
Axis.ShowLabels := true;
s := GetAttrValue(AStyleNode, 'chart:logarithmic');
if s = 'true' then
Axis.Logarithmic := true;
s := GetAttrValue(AStyleNode, 'chart:minimum');
if (s = 'true') and TryStrToFloat(s, value, FPointSeparatorSettings) then
begin
Axis.Min := value;
Axis.AutomaticMin := false;
end else
Axis.AutomaticMin := true;
s := GetAttrValue(AStyleNode, 'chart:maximum');
if (s = 'true') and TryStrToFloat(s, value, FPointSeparatorSettings) then
begin
Axis.Max := value;
Axis.AutomaticMax := false;
end else
Axis.AutomaticMax := true;
s := GetAttrValue(AStyleNode, 'chart:interval-major');
if (s <> '') and TryStrToFloat(s, value, FPointSeparatorSettings) then
Axis.MajorInterval := value;
s := GetAttrValue(AStyleNode, 'chart:interval-minor-divisor');
if (s <> '') and TryStrToInt(s, n) then
Axis.MinorCount := n;
s := GetAttrValue(AStyleNode, 'chart:axis-position');
case s of
'start':
Axis.Position := capStart;
'end':
Axis.Position := capEnd;
else
if TryStrToFloat(s, value, FPointSeparatorSettings) then
begin
Axis.Position := capValue;
Axis.PositionValue := value;
end;
end;
ticks := []; // To do: check defaults...
s := GetAttrValue(AStyleNode, 'chart:tick-marks-major-inner');
if s = 'true' then ticks := ticks + [catInside];
s := GetAttrValue(AStyleNode, 'chart:tick-marks-major-outer');
if s = 'true' then ticks := ticks + [catOutside];
Axis.MajorTicks := ticks;
ticks := []; // To do: check defaults...
s := GetAttrValue(AStyleNode, 'chart:tick-marks-minor-inner');
if s = 'true' then ticks := ticks + [catInside];
s := GetAttrValue(AStyleNode, 'chart:tick-marks-minor-outer');
if s = 'true' then ticks := ticks + [catOutside];
Axis.MinorTicks := ticks;
s := GetAttrValue(AStyleNode, 'chart:reverse-direction');
if s = 'true' then Axis.Inverted := true;
s := GetAttrValue(AStyleNode, 'style:rotation-angle');
if (s <> '') and TryStrToFloat(s, value, FPointSeparatorSettings) then
Axis.LabelRotation := Round(value);
end;
end;
AStyleNode := AStyleNode.NextSibling;
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartBackgroundStyle(AStyleNode: TDOMNode;
AChart: TsChart);
var
@ -469,6 +626,20 @@ begin
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartCellRange(ANode: TDOMNode;
AChart: TsChart; var ARange: TsCellRange);
var
s: String;
rng: TsCellRange;
sh1, sh2: String;
relFlags: TsRelFlags;
begin
s := GetAttrValue(ANode, 'table:cell-range-address');
if (s <> '') and TryStrToCellRange_ODS(s, sh1, sh2, rng.Row1, rng.Col1, rng.Row2, rng.Col2, relFlags) then
// TO DO: sheets are ignored here !!!
ARange := rng;
end;
procedure TsSpreadOpenDocChartReader.ReadChartFiles(AStream: TStream;
AFileList: String);
var
@ -566,7 +737,48 @@ end;
procedure TsSpreadOpenDocChartReader.ReadChartPlotAreaProps(ANode, AStyleNode: TDOMNode;
AChart: TsChart);
var
nodeName: String;
styleName: String;
styleNode: TDOMNode;
begin
styleName := GetAttrValue(ANode, 'chart:style-name');
styleNode := FindStyleNode(AStyleNode, styleName);
ReadChartPlotAreaStyle(styleNode, AChart);
ANode := ANode.FirstChild;
while ANode <> nil do
begin
nodeName := ANode.NodeName;
case nodeName of
'chart:axis':
ReadChartAxisProps(ANode, AStyleNode, AChart);
end;
ANode := ANode.NextSibling;
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartPlotAreaStyle(AStyleNode: TDOMNode; AChart: TsChart);
var
nodeName, s: String;
begin
AStyleNode := AStyleNode.FirstChild;
while AStyleNode <> nil do
begin
nodeName := AStyleNode.NodeName;
case nodeName of
'style:chart-properties':
begin
s := GetAttrValue(AStyleNode, 'chart:stacked');
if s = 'true' then
AChart.StackMode := csmStacked;
s := GetAttrValue(AStyleNode, 'chart:percentage');
if s = 'true' then
Achart.StackMode := csmStackedPercentage;
end;
end;
AStyleNode := AStyleNode.NextSibling;
end;
end;
procedure TsSpreadOpenDocChartReader.ReadChartLegendProps(ANode, AStyleNode: TDOMNode;
@ -1019,7 +1231,7 @@ begin
if not Axis.AutomaticMajorInterval then
chartProps := chartProps + Format('chart:interval-major="%g" ', [Axis.MajorInterval], FPointSeparatorSettings);
if not Axis.AutomaticMinorSteps then
chartProps := chartProps + Format('chart:interval-minor-divisor="%d" ', [Axis.MinorSteps]);
chartProps := chartProps + Format('chart:interval-minor-divisor="%d" ', [Axis.MinorCount]);
// Position of the axis
case Axis.Position of
@ -1133,8 +1345,8 @@ begin
5: axis := AChart.X2Axis;
6: axis := AChart.Y2Axis;
end;
font := axis.CaptionFont;
rotAngle := axis.CaptionRotation;
font := axis.Title.Font;
rotAngle := axis.Title.RotationAngle;
if AChart.RotatedAxes then
begin
if rotAngle = 0 then rotAngle := 90 else if rotAngle = 90 then rotAngle := 0;
@ -1947,13 +2159,13 @@ begin
inc(AStyleID);
// Axis title
if Axis.ShowCaption and (Axis.Caption <> '') then
if Axis.Title.Visible and (Axis.Title.Caption <> '') then
begin
AppendToStream(AChartStream, Format(
indent + ' <chart:title chart:style-name="ch%d">' + LE +
indent + ' <text:p>%s</text:p>' + LE +
indent + ' </chart:title>' + LE,
[ AStyleID, Axis.Caption ]
[ AStyleID, Axis.Title.Caption ]
));
// Axis title style