diff --git a/components/fpspreadsheet/examples/other/chart/piechart_write_demo.lpr b/components/fpspreadsheet/examples/other/chart/piechart_write_demo.lpr
index abaf766c2..99cc4ca33 100644
--- a/components/fpspreadsheet/examples/other/chart/piechart_write_demo.lpr
+++ b/components/fpspreadsheet/examples/other/chart/piechart_write_demo.lpr
@@ -54,7 +54,7 @@ begin
ser.SetLabelRange(4, 0, 8, 0);
ser.SetYRange(4, 1, 8, 1);
ser.DataLabels := [cdlCategory, cdlValue];
- ser.LabelSeparator := '\n'; // this is the symbol for a line-break
+ ser.LabelSeparator := #10; // '\n'; // this is the symbol for a line-break
ser.LabelPosition := lpOutside;
ser.LabelFormat := '#,##0';
diff --git a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas
index 5035666d3..34e85229d 100644
--- a/components/fpspreadsheet/source/common/fpsopendocumentchart.pas
+++ b/components/fpspreadsheet/source/common/fpsopendocumentchart.pas
@@ -1691,16 +1691,20 @@ begin
nodeName := childNode2.NodeName;
if nodeName = 'text:p' then
begin
- childNode3 := childNode2.FirstChild;
- while childNode3 <> nil do
+ ASeries.LabelSeparator := GetNodeValue(childNode2);
+ if ASeries.LabelSeparator = '' then
begin
- nodeName := childNode3.NodeName;
- if nodeName = 'text:line-break' then
+ childNode3 := childNode2.FirstChild;
+ while childNode3 <> nil do
begin
- ASeries.LabelSeparator := LineEnding;
- break;
+ nodeName := childNode3.NodeName;
+ if nodeName = 'text:line-break' then
+ begin
+ ASeries.LabelSeparator := LineEnding;
+ break;
+ end;
+ childNode3 := childNode3.NextSibling;
end;
- childNode3 := childNode3.NextSibling;
end;
end;
childNode2 := childNode2.NextSibling;
@@ -2825,8 +2829,14 @@ begin
else
begin
labelSeparator := series.LabelSeparator;
- if pos('\n', labelSeparator) > 0 then
- labelSeparator := StringReplace(labelSeparator, '\n', '', [rfReplaceAll, rfIgnoreCase]);
+ if (pos('\n', labelSeparator) > 0) then
+ labelSeparator := StringReplace(labelSeparator, '\n', '', [rfReplaceAll, rfIgnoreCase])
+ else if (pos(#13#10, labelSeparator) > 0) then
+ labelSeparator := StringReplace(labelSeparator, #13#10, '', [rfReplaceAll, rfIgnoreCase])
+ else if (pos(#10, labelSeparator) > 0) then
+ labelSeparator := StringReplace(labelSeparator, #10, '', [rfReplaceAll, rfIgnoreCase])
+ else if (pos(#13, labelSeparator) > 0) then
+ labelSeparator := StringReplace(labelSeparator, #13, '', [rfReplaceAll, rfIgnoreCase]);
labelSeparator :=
indent + ' ' + LE +
indent + ' ' + labelSeparator + '' + LE +
@@ -3966,24 +3976,6 @@ begin
end;
end;
-{
- for i := 0 to count - 1 do
- begin
- if (i >= series.DataPointStyles.Count) or (series.DataPointStyles[i] = nil) then
- AppendToStream(AChartStream,
- indent + ' ' + LE
- )
- else
- begin
- AppendToStream(AChartStream, Format(
- indent + ' ' + LE, // ToDo: could contain "chart:repeated"
- [ dataStyleID + i]
- ));
- inc(nextStyleID);
- end;
- end;
- end;
- }
AppendToStream(AChartStream,
indent + '' + LE
);
@@ -4034,19 +4026,6 @@ begin
inc(dataStyleID);
end;
end;
- (*
-
- for i := 0 to series.DataPointStyles.Count - 1 do
- begin
- datapointStyle := series.DatapointStyles[i];
- for j := prevIdx+1 to datapointStyle.DataPointIndex-1 then;
-
- AppendToStream(AStyleStream,
- GetChartSeriesDataPointStyleAsXML(AChart, ASeriesIndex, i, AStyleIndent, dataStyleID)
- );
- inc(dataStyleID);
- end;
- *)
// Next style
AStyleID := nextStyleID;
diff --git a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas
index 1617235a1..6a1ce2458 100644
--- a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas
+++ b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas
@@ -1866,6 +1866,12 @@ begin
child1 := child1.NextSibling;
end;
end;
+ 'c:separator':
+ begin
+ s := GetNodeValue(ANode);
+ if (s = #10) or (s = #13#10) or (s = #13) then s := LineEnding;
+ ASeries.LabelSeparator := s;
+ end;
end;
ANode := ANode.NextSibling;
end;
@@ -4055,16 +4061,30 @@ procedure TsSpreadOOXMLChartWriter.WriteChartSeriesDatapointLabels(AStream: TStr
AIndent: Integer; ASeries: TsChartSeries);
var
indent: String;
+ separator: String = '';
begin
if ASeries.DataLabels = [] then
exit;
indent := DupeString(' ', AIndent);
+ separator := trim(ASeries.LabelSeparator);
+
+ case ASeries.LabelSeparator of
+ '\n', #10, #13, #13#10:
+ separator := FPS_LINE_ENDING; // Excel wants #10
+ ' ':
+ separator := '';
+ else
+ separator := ASeries.LabelSeparator;
+ end;
+ if separator <> '' then
+ separator := indent + ' ' + separator + '' + LE;
+
AppendToStream(AStream, Format(
indent + '' + LE +
indent + ' ' + LE +
- GetChartFillAndLineXML(AIndent + 4, ASeries.Chart, ASeries.LabelBackground, ASeries.LabelBorder) + LE +
+ GetChartFillAndLineXML(AIndent + 4, ASeries.Chart, ASeries.LabelBackground, ASeries.LabelBorder) + LE +
indent + ' ' + LE +
indent + ' ' + LE +
indent + ' ' + LE +
@@ -4073,6 +4093,7 @@ begin
indent + ' ' + LE +
indent + ' ' + LE +
indent + ' ' + LE +
+ separator +
indent + '' + LE,
[
FALSE_TRUE[cdlSymbol in ASeries.DataLabels],
diff --git a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas
index 09d35dd94..b15a30d46 100644
--- a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas
+++ b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas
@@ -2428,10 +2428,8 @@ procedure TsWorkbookChartLink.UpdateChartSeriesMarks(AWorkbookSeries: TsChartSer
AChartSeries: TChartSeries);
begin
ConstructSeriesMarks(AWorkbookSeries, AChartSeries);
- AChartSeries.Marks.LinkPen.Visible := false;
AChartSeries.Marks.YIndex := -1;
- AChartSeries.Marks.Distance := 20;
AChartSeries.Marks.Attachment := maDefault;
Convert_sFont_to_Font(AWorkbookSeries.LabelFont, AChartSeries.Marks.LabelFont);
@@ -2496,6 +2494,13 @@ begin
lcsEllipseWedge: AChartSeries.Marks.Shape := clsEllipse; // replacement
else AChartSeries.Marks.Shape := clsRectangle; // replacement
end;
+
+ AChartSeries.Marks.LinkPen.Visible := (cdlLeaderLines in AWorkbookSeries.DataLabels);
+ AChartSeries.Marks.LinkPen.Color := AChartSeries.Marks.Frame.Color;
+ if AChartSeries.Marks.LinkPen.Visible then
+ AChartSeries.Marks.Distance := 20
+ else
+ AChartSeries.Marks.Distance := 0;
end;
procedure TsWorkbookChartLink.UpdateChartSeriesTrendline(AWorkbookSeries: TsChartSeries;