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;